将配置应用于基类而不创建表

问题描述 投票:0回答:1

我首先使用Migrations功能,按照Entity Framework代码的原理制作应用程序。

为了避免在每个类中使用相同的代码,我制作了一个名为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 ef-migrations
1个回答
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派生的所有类型并动态注册配置。

© www.soinside.com 2019 - 2024. All rights reserved.