【问题标题】:Apply configuration to base class without creating a table将配置应用于基类而不创建表
【发布时间】:2020-10-04 05:06:05
【问题描述】:

我正在制作一个应用程序,首先遵循实体框架代码的原则,使用Migrations 功能。

为了避免在每个类中使用相同的代码,我创建了一个名为 AuditableEntity 的基类,其中包含所有(可审计的)实体必须包含的基本属性:

public abstract class AuditableEntity
{
    public int Id { get; private set; }
    public string CreatedBy { get; private set; }
    public DateTime CreatedDtm { get; private set; }
}

现在CreatedBy 字段的默认 SQL 值应该是CURRENT_USER

并且字段CreatedDtm 应该有一个默认的SQL 值GETDATE()

通常我会为表格创建一个配置文件,在其中完成此操作,如下所示:

public class AuditableEntityConfiguration : IEntityTypeConfiguration<AuditableEntity>
{
    public void Configure(EntityTypeBuilder<AuditableEntity> builder)
    {
        builder.Property(e => e.CreatedBy).HasDefaultValueSql("USER_NAME()");
        builder.Property(e => e.CreatedDtm).HasDefaultValueSql("GETDATE()");
    }
}

但如果我这样做,实体框架想要创建一个名为AuditableEntity 的表。这(显然)不是我的意图。我希望AuditableEntity 是一个抽象的基础,而不是一个实际的实体。或者换句话说,我希望它为我的实际实体提供一些非常基本的共享功能。

我有什么办法可以做类似的事情,它允许所有从AuditableEntity 继承的类获取上述默认 SQL 值?

我希望它以某种方式完成,以便逻辑适用于数据库级别,因此它不像在 C# 代码中设置值那么简单。

【问题讨论】:

    标签: c# entity-framework-core ef-code-first entity-framework-migrations


    【解决方案1】:

    您可以创建一个泛型类,这将避免为每种类型创建一个配置类,但您需要为每种类型注册配置:

    public class AuditableEntityConfiguration<T> : IEntityTypeConfiguration<T> where T : AuditableEntity
    {
        public void Configure(EntityTypeBuilder<T> builder)
        {
            builder.Property(e => e.CreatedBy).HasDefaultValueSql("USER_NAME()");
            builder.Property(e => e.CreatedDtm).HasDefaultValueSql("GETDATE()");
        }
    }
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new AuditableEntityConfiguration<DerivedClass1>());
        modelBuilder.ApplyConfiguration(new AuditableEntityConfiguration<DerivedClass2>());
    }
    

    如果速度不重要,那么您始终可以使用反射来获取从 AuditableEntity 派生的所有类型并动态注册配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2015-11-28
      • 2016-02-10
      • 2021-01-11
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      相关资源
      最近更新 更多