EF Core 2中的通用实体配置类

4
我正在尝试为我的实体创建一个通用的配置类,但我卡住了。
我有一个名为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; }
}

还有许多继承自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
    }

我希望能够调用类似 builder.ConfigureBase() 的东西,以避免代码重复。有什么想法吗?

这是纯粹用于设置默认值,还是类似于“在插入/编辑时自动设置这些值”的情况? - Marco
只需将TenantId配置为索引并设置CreatedOn属性的默认值。 - alecardv
1个回答

5

有几种方法可以实现这个目标。例如,由于您似乎正在使用 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()");

    }
}

带有示例用法的内容:

使用示例:

void IEntityTypeConfiguration<MyEntity>.Configure(EntityTypeBuilder<MyEntity> builder)
{
    builder.ConfigureBase();
    // Other specific configurations here
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接