C# Ef core fluent api设置所有列类型的接口
不幸的是,efcore不支持TPC模式,但我们需要这种行为。我编写了一个称为IBase的接口,每个实体都实现了这个接口:C# Ef core fluent api设置所有列类型的接口,c#,entity-framework,.net-core,entity-framework-core,ef-fluent-api,C#,Entity Framework,.net Core,Entity Framework Core,Ef Fluent Api,不幸的是,efcore不支持TPC模式,但我们需要这种行为。我编写了一个称为IBase的接口,每个实体都实现了这个接口: public interface IBase { Guid Id { get; set; } [Column(TypeName = "datetime2")] DateTime CreateDate { get; set; } [Required] [StringLength(255)] string CreateUser
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; }
}
我想去掉注释,改用fluentapi配置。但是我有大约20个不同的实体和7个基本值,我不想一次又一次地进行相同的配置:
modelBuilder.Entity<SomeEntity>()
.Property(e => e.CreateDate)
.HasColumnType("datetime2(2)")
.IsRequired();
modelBuilder.Entity()
.Property(e=>e.CreateDate)
.HasColumnType(“日期时间2(2)”)
.IsRequired();
如何为实现IBase的所有实体一次性配置每个基本属性?EF core非常适合基类/继承,因此只需创建一个基本泛型类并将常见内容放入其中,然后从这些基类继承模型,如下所示:
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 }
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());
}
}
此解决方案适用于实体框架而非核心:
modelBuilder.Types<BaseModel>().Configure((configuration) =>
{
configuration.Property(p => p.CreateUser)
.HasMaxLength(250)
.IsRequired();
});
modelBuilder.Types().Configure((配置)=>
{
属性(p=>p.CreateUser)
.HasMaxLength(250)
.IsRequired();
});
首先:感谢您的努力!但是我的“TPC”提示呢?基类不适合我,除非您能告诉我如何在每个数据库表中拥有所有的基值。EF 6提供了3种不同的模式(TPH、TPC和TPT),EF core仅支持TPH。所以你的答案“在内容上”是正确的,但实际上并不是对我问题的回答(直到现在)…先试试看。它将为每种混凝土类型创建单独的表。这就是TPC。第二部分-配置与模型继承完全无关,它是关于配置继承的,所以您可以使用接口或任何东西。对不起!!我试过了,你是对的——它很有效!但我希望至少有一点是正确的……)您的第二个声明不正确-如果我尝试使用EntityTypeBuilder的接口,我会遇到以下错误:为参数“clrType”提供的实体类型“EfTEst.IBase”必须是引用类型。使用如下声明可以轻松解决此问题:BaseConfiguration,其中TBase:class,IBase