在EF Core中配置抽象基类而不创建表

时间:2019-01-05 06:11:19

标签: c# entity-framework migration entity-framework-core database-migration

我通过创建DateCreated类向每个实体添加了UserCreatedDateModifiedUserModifiedBaseEntity.cs字段。我的要求是生成一个具有base类的所有字段作为列的单个表。

public class BaseEntity
{
     public DateTime? DateCreated { get; set; }
     public string UserCreated { get; set; }
     public DateTime? DateModified { get; set; }
     public string UserModified { get; set; }
}

这是我的Student

public class Student : BaseEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

这是我的上下文课程

public class SchoolContext: DbContext
{       
    public LibraContext(DbContextOptions<SchoolContext> options)
        : base(options)
    { }

    public DbSet<Student> Students { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
        //CreatedDate 
        modelBuilder.Entity<BaseEntity>().Property(x => x.DateCreated).HasDefaultValueSql("GETDATE()");
        //Updated Date
        modelBuilder.Entity<BaseEntity>().Property(x => x.DateModified).HasDefaultValueSql("GETDATE()");
 }

我已经运行以下迁移命令来创建脚本和更新数据库

Add-Migration -Name "InitialMigration" -Context "SchoolContext"
update-database

它已在SQL Server数据库中创建了单独的表BaseEntityStudent。我的期望是创建一个包含所有Student字段作为列的单个BaseEntity表。

如何实现?

我正在使用ASP.NET CORE2.1

3 个答案:

答案 0 :(得分:2)

根据Microsoft Documentation,您可以使用[NotMapped]数据注释或modelBuilder.Ignore<TEntity>();来忽略BaseEntity的表创建,如下所示:

但是在您的情况下,[NotMapped]不能为您提供帮助,因为Fluent API始终具有比数据注释(属性)更高的优先级。因此,您可以在modelBuilder.Ignore<BaseEntity>();的{​​{1}}配置之后调用BaseEntity,但是调用OnModelCreating会丢失modelBuilder.Ignore<BaseEntity>();配置。

因此,据我所知,最佳解决方案如下:

编写BaseEntity的配置,如下所示:

BaseEntity

然后按如下所示编写public class BaseEntityConfigurations<TEntity> : IEntityTypeConfiguration<TEntity> where TEntity : BaseEntity { public virtual void Configure(EntityTypeBuilder<TEntity> builder) { //CreatedDate builder.Property(x => x.DateCreated).HasDefaultValueSql("GETDATE()"); //Updated Date builder.Property(x => x.DateModified).HasDefaultValueSql("GETDATE()"); } } 的配置:

Student

然后在public class StudentConfigurations : BaseEntityConfigurations<Student> { public override void Configure(EntityTypeBuilder<Student> builder) { base.Configure(builder); // Must call this // other configurations here } } 中进行如下操作:

OnModelCreating

迁移将生成唯一具有protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.ApplyConfiguration(new StudentConfigurations()); } 配置的Student表,如下所示:

BaseEntity

答案 1 :(得分:0)

TPC模式当前位于backlog上,这意味着正在考虑将其作为功能部件包括在内,但尚未设置日期。

read more.

答案 2 :(得分:0)

我已经通过简单的更改解决了该问题!我们必须在<add binding="basicHttpsBinding" scheme="https" bindingConfiguration="basicHttpBinding_eLink" /> 中使用Student实体。我被误用了modelbuilder

BaseEntity

未解决的问题: protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Student>().Property(x => x.Created).HasDefaultValueSql("GETDATE()"); modelBuilder.Entity<Student>().Property(x => x.Updated).HasDefaultValueSql("GETDATE()"); } 无法控制生成的表列的顺序。 .net核心当前不支持此功能。