在不创建 table 的情况下将配置应用于基础 class
Apply configuration to base class without creating a table
我正在制作一个应用程序,遵循 Entity Framework 代码优先的原则,使用 Migrations 功能。
为了避免在每个 class 中使用相同的代码,我制作了一个名为 AuditableEntity
的基础 class,它包含所有 (auditable)实体必须包含:
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()
。
通常我会为 table 创建一个配置文件,在其中完成,如下所示:
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()");
}
}
但是如果我这样做,Entity Framework 想要创建一个名为 AuditableEntity
的 table。这(显然)不是我的意图。我希望 AuditableEntity
是一个抽象的基础,而不是一个实际的实体。或者换句话说,我希望它为我的实际实体提供一些非常基本的共享功能。
有没有什么方法可以做类似的事情,允许所有从 AuditableEntity
继承的 classes 获得上述默认的 SQL 值?
我希望以某种方式完成,以便逻辑适用于数据库级别,因此它不像在 C# 代码中设置值那么简单。
您可以创建一个通用 class,这将避免为每种类型创建配置 class,但您需要为每种类型注册配置:
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 派生的所有类型并动态注册配置。
我正在制作一个应用程序,遵循 Entity Framework 代码优先的原则,使用 Migrations 功能。
为了避免在每个 class 中使用相同的代码,我制作了一个名为 AuditableEntity
的基础 class,它包含所有 (auditable)实体必须包含:
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()
。
通常我会为 table 创建一个配置文件,在其中完成,如下所示:
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()");
}
}
但是如果我这样做,Entity Framework 想要创建一个名为 AuditableEntity
的 table。这(显然)不是我的意图。我希望 AuditableEntity
是一个抽象的基础,而不是一个实际的实体。或者换句话说,我希望它为我的实际实体提供一些非常基本的共享功能。
有没有什么方法可以做类似的事情,允许所有从 AuditableEntity
继承的 classes 获得上述默认的 SQL 值?
我希望以某种方式完成,以便逻辑适用于数据库级别,因此它不像在 C# 代码中设置值那么简单。
您可以创建一个通用 class,这将避免为每种类型创建配置 class,但您需要为每种类型注册配置:
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 派生的所有类型并动态注册配置。