问题
Unfortunately ef core does not support TPC-pattern, but we need this kind of behaviour. I´ve wrote an interface which is called IBase and each entity implements this 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; }
}
I want to get rid of Annotations to use the Fluent API configuration instead. But I have about 20 different entities and 7 Base-Values and I don´t want to make the same configuration over and over again:
modelBuilder.Entity<SomeEntity>()
.Property(e => e.CreateDate)
.HasColumnType("datetime2(2)")
.IsRequired();
Any ideas how to configure each Base-Property once for all entities implementing IBase?
回答1:
EF core perfectly fine with base classes/inheritance, so just create an base generic class and put common things into it and then inherit your models from those base class like that:
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 }
If for some reason it's deadly important for you to use fluentapi than there is a configuration interface exists called IEntityTypeConfiguration<TModel>
and all what you need is again create base configuration and latter inherit specific configurations from it. And after that apply those configurations in your DbContext.OnModelCreating
method somewhat like that:
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());
}
}
来源:https://stackoverflow.com/questions/45943048/ef-core-fluent-api-set-all-column-types-of-interface