Ef core fluent api设置所有列类型的接口

Jos*_*hit 2 c# entity-framework entity-framework-core ef-fluent-api .net-core

不幸的是,ef core不支持TPC模式,但我们需要这种行为.我写了一个名为IBase的接口,每个实体都实现了这个接口:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我想摆脱Annotations来改为使用Fluent API配置.但我有大约20个不同的实体和7个Base-Values,我不想一遍又一遍地做出相同的配置:

 modelBuilder.Entity<SomeEntity>()
            .Property(e => e.CreateDate)
            .HasColumnType("datetime2(2)")
            .IsRequired();
Run Code Online (Sandbox Code Playgroud)

任何想法如何为所有实施IBase的实体配置一次Base-Property?

Ph0*_*n1x 8

EF核心与基类/继承完美搭配,所以只需创建一个基类泛型类并将常用内容放入其中,然后从这些基类继承您的模型:

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 }
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因,使用fluentapi比使用配置接口存在致命的重要性,IEntityTypeConfiguration<TModel>并且您需要的所有内容再次创建基本配置,并且后者从中继承特定配置.之后,在您的DbContext.OnModelCreating方法中应用这些配置有点像:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)