ef core fluent api 设置界面所有列类型
Ef core fluent api set all column types of interface
不幸的是 ef 核心不支持 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; }
}
我想摆脱注释,改用 Fluent API 配置。但是我有大约 20 个不同的实体和 7 个基本值,我不想一遍又一遍地进行相同的配置:
modelBuilder.Entity<SomeEntity>()
.Property(e => e.CreateDate)
.HasColumnType("datetime2(2)")
.IsRequired();
关于如何为所有实施 IBase 的实体配置每个 Base-属性 一次的任何想法?
EF 核心与基础 classes/inheritance 完美匹配,因此只需创建一个基础泛型 class 并将常用的东西放入其中,然后从这些基础 class 继承您的模型,如下所示:
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 }
如果出于某种原因使用 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());
}
}
此解决方案适用于 Entity Framework 不适用于核心:
modelBuilder.Types<BaseModel>().Configure((configuration) =>
{
configuration.Property(p => p.CreateUser)
.HasMaxLength(250)
.IsRequired();
});
不幸的是 ef 核心不支持 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; }
}
我想摆脱注释,改用 Fluent API 配置。但是我有大约 20 个不同的实体和 7 个基本值,我不想一遍又一遍地进行相同的配置:
modelBuilder.Entity<SomeEntity>()
.Property(e => e.CreateDate)
.HasColumnType("datetime2(2)")
.IsRequired();
关于如何为所有实施 IBase 的实体配置每个 Base-属性 一次的任何想法?
EF 核心与基础 classes/inheritance 完美匹配,因此只需创建一个基础泛型 class 并将常用的东西放入其中,然后从这些基础 class 继承您的模型,如下所示:
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 }
如果出于某种原因使用 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());
}
}
此解决方案适用于 Entity Framework 不适用于核心:
modelBuilder.Types<BaseModel>().Configure((configuration) =>
{
configuration.Property(p => p.CreateUser)
.HasMaxLength(250)
.IsRequired();
});