Sfortunatamente l'ef core non supporta il pattern TPC, ma abbiamo bisogno di questo tipo di comportamento. Ho scritto un'interfaccia che si chiama IBase e ogni entità implementa questa interfaccia:
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; }
}
Voglio eliminare Annotations per utilizzare invece la configurazione API Fluent. Ma ho circa 20 diverse entità e 7 Base-Values e non voglio fare la stessa configurazione più e più volte:
modelBuilder.Entity<SomeEntity>()
.Property(e => e.CreateDate)
.HasColumnType("datetime2(2)")
.IsRequired();
Qualche idea su come configurare ogni Base-Property una volta per tutte le entità che implementano IBase?
Il core EF si integra perfettamente con le classi di base / l'ereditarietà, quindi basta creare una classe generica di base e inserire elementi comuni in esso e quindi ereditare i tuoi modelli da quelle classi di base in questo modo:
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 }
Se per qualche ragione è estremamente importante per te usare fluentapi di quanto esiste un'interfaccia di configurazione chiamata IEntityTypeConfiguration<TModel>
e tutto ciò di cui hai bisogno è di nuovo creare la configurazione di base e quest'ultima eredita da essa configurazioni specifiche. E dopo di ciò applicate queste configurazioni nel vostro metodo DbContext.OnModelCreating
in un DbContext.OnModelCreating
modo:
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());
}
}
Questa soluzione funziona per Entity Framework non Core:
modelBuilder.Types<BaseModel>().Configure((configuration) =>
{
configuration.Property(p => p.CreateUser)
.HasMaxLength(250)
.IsRequired();
});