ale*_*rdv 3 c# entity-framework-core ef-core-2.0
我正在尝试为我的实体创建一个通用配置类,但我被卡住了。
我有一个名为 EntityBase 的抽象类:
public abstract class EntityBase
{
public int Id { get; set; }
public int TenantId { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime UpdatedOn { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以及从 EntityBase 继承的许多其他类,其中我必须使用相同的代码在每个类中配置 DateTime 属性。这边走:
void EntityTypeConfiguration<MyEntity>.Configure(EntityTypeBuilder<MyEntity> builder)
{
builder.HasIndex(e => e.TenantId);
builder.Property(e => e.CreatedOn)
.ValueGeneratedOnAdd()
.HasDefaultValueSql("GETDATE()");
// Other specific configurations here
}
Run Code Online (Sandbox Code Playgroud)
我希望能够调用类似的东西:builder.ConfigureBase() 并避免代码重复。有任何想法吗?
有几种方法可以实现目标。例如,由于您似乎在使用IEntityTypeConfiguration<TEntity>
类,您可以使用virtual void Configure
方法创建一个基本的通用配置类,并让您的具体配置类从它继承、覆盖Configure
方法并base.Configure
在进行特定调整之前调用。
但是假设您希望能够准确地调用builder.ConfigureBase()
. 为了允许这种语法,您可以简单地将公共代码移动到自定义通用扩展方法,如下所示:
public static class EntityBaseConfiguration
{
public static void ConfigureBase<TEntity>(this EntityTypeBuilder<TEntity> builder)
where TEntity : EntityBase
{
builder.HasIndex(e => e.TenantId);
builder.Property(e => e.CreatedOn)
.ValueGeneratedOnAdd()
.HasDefaultValueSql("GETDATE()");
}
}
Run Code Online (Sandbox Code Playgroud)
使用示例:
void IEntityTypeConfiguration<MyEntity>.Configure(EntityTypeBuilder<MyEntity> builder)
{
builder.ConfigureBase();
// Other specific configurations here
}
Run Code Online (Sandbox Code Playgroud)