1

Malheureusement, ef core ne prend pas en charge TPC-modèle, mais nous avons besoin de ce genre de comportement. Ive a écrit une interface qui est appelée IBase et chaque entité implémente cette interface:Api noyau fluide API mis tous les types de colonne de l'interface

public interface IBase 
{ 
    Guid Id { get; set; } 

    [Column(TypeName = "datetime2")] 
    DateTime CreateDate { get; set; } 

    [Required] 
    [StringLength(255)] 
    string CreateUser { get; set; } 

    bool Deleted { get; set; } 
} 

Je veux débarrasser des annotations d'utiliser la configuration API Fluent à la place. Mais j'ai environ 20 entités différentes et 7 Base-valeurs et je veux ne pas faire la même configuration, encore et encore:

modelBuilder.Entity<SomeEntity>() 
      .Property(e => e.CreateDate) 
      .HasColumnType("datetime2(2)") 
      .IsRequired(); 

Toute idée comment configurer une fois par Base-propriété pour toutes les entités de mise en œuvre IBase ?

Répondre

7

noyau EF parfaitement bien avec les classes de base/héritage, donc il suffit de créer une classe générique de base et mettre les choses communes dans, puis hériter vos modèles de ceux classe de base comme:

public abstract class BaseModel<TId> 
{ 
    TId Id { get; set; } 

    [Column(TypeName = "datetime2")] 
    DateTime CreateDate { get; set; } 

    [Required] 
    [StringLength(255)] 
    string CreateUser { get; set; } 

    bool Deleted { get; set; } 
} 

class Model : BaseModel<Guid>{ ... //model specific stuff } 

Si pour une raison quelconque, il est vital pour vous d'utiliser fluentapi qu'il existe une interface de configuration appelée IEntityTypeConfiguration<TModel> et tout ce dont vous avez besoin est à nouveau créer une configuration de base et celle-ci hérite de configurations spécifiques. Et après cela appliquer ces configurations dans votre méthode DbContext.OnModelCreating un peu comme ça:

class BaseConfiguration<TBaseModel> : IEntityTypeConfiguration<TBaseModel> 
{ 
    public virtual void Configure(EntityTypeBuilder<TBaseModel> builder) 
    { 
     builder.Property... 
    } 
} 

class ModelConfiguration : BaseConfiguration<Model> 
{ 
    public override void Configure(EntityTypeBuilder<Model> builder) 
    { 
     base.Configure(builder) 
     ...// model specific stuff 
    } 
} 

class CustomDbContext : DbContext 
{ 
    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.ApplyConfiguration(new ModelConfiguration()); 
    } 
} 
+0

Tout d'abord: Merci pour votre effort! Mais qu'en est-il de mon "TPC" -Hint? La classe de base ne me convient pas, à moins que vous ne puissiez me dire comment je peux avoir toutes mes valeurs de base dans chaque base de données. EF 6 a fourni 3 modèles différents (TPH, TPC et TPT), ef core ne supporte que TPH. Donc, votre réponse est correcte "in-content" mais pas vraiment une réponse à ma question (jusqu'à présent) ... – Joshit

+0

Essayez-le d'abord. Il va créer une table séparée pour chaque type de béton. donc c'est TPC. La deuxième partie de la configuration n'a rien à voir avec l'héritage du modèle, il s'agit de l'héritage de la configuration, donc vous pouvez utiliser l'interface ou autre chose. – Ph0en1x

+0

Je suis désolé !! Je l'ai essayé, et vous avez raison - ça marche! Mais je veux avoir raison au moins un point ..;) Votre deuxième revendication n'est pas correcte - si j'essaie d'utiliser une interface pour EntityTypeBuilder j'obtiens l'erreur suivante: Le type d'entité 'EfTEst.IBase' fourni pour l'argument 'clrType 'doit être un type de référence. – Joshit