C# 在EF code first MVC中从基类正确创建表结构

C# 在EF code first MVC中从基类正确创建表结构,c#,asp.net-mvc,entity-framework,model-view-controller,C#,Asp.net Mvc,Entity Framework,Model View Controller,我有一个DB集合模型,它继承自基类模型,如下所示 基类: public abstract class BaseModel { [Key] public int Id { get; set; } public bool IsActive { get; set; } public int ModifiedBy { get; set; } public DateTime ModifiedDate { get;

我有一个DB集合模型,它继承自基类模型,如下所示

基类:

 public abstract  class BaseModel
    {
        [Key]
        public int Id { get; set; }
        public bool IsActive { get; set; }
        public int ModifiedBy { get; set; }
        public DateTime ModifiedDate { get; set; }
        public int AddedBy { get; set; }
        public DateTime AddedDate { get; set; }
    }
儿童班:

public class AccountType : BaseModel
    {
        //[Key]
        //public int Account_Type_Id { get; set; }
        [Required]
        [MaxLength(50)]
        public string Account_Type_Name { get; set; }

        [Required]
        [MaxLength(10)]
        public string Account_Type_Code { get; set; }

        [MaxLength(100)]
        public string AccountType_Description { get; set; }

    }
我的DBContext如下所示:

 public class BankApplicationContext :DbContext
    {
        public BankApplicationContext() : base("BankContextEntities")
        {
            Database.SetInitializer(new BankApplicationIntializer());
        }

        public virtual DbSet<AccountType> AccountTypes { get; set; }

        public virtual DbSet<BaseModel> BaseModels { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<BaseModel>().ToTable("BaseModel");
            modelBuilder.Entity<AccountType>().ToTable("AccountType");
        }

    }
公共类BankApplicationContext:DbContext
{
public BankApplicationContext():基本(“BankContexties”)
{
Database.SetInitializer(新的bankApplicationInitializer());
}
公共虚拟数据库集

但我需要在子类中生成的基类中的所有审核列,如下所示:

 public class BankApplicationContext :DbContext
    {
        public BankApplicationContext() : base("BankContextEntities")
        {
            Database.SetInitializer(new BankApplicationIntializer());
        }

        public virtual DbSet<AccountType> AccountTypes { get; set; }

        public virtual DbSet<BaseModel> BaseModels { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<BaseModel>().ToTable("BaseModel");
            modelBuilder.Entity<AccountType>().ToTable("AccountType");
        }

    }
账户类型:

Id(帐户类型的主键)

AccountTypeName

帐户类型代码

帐户类型说明

活跃的

修改

修饰酸

加上

AddedDate

您需要一个结构

但问题是:这只适用于非抽象类

如果我们假定
BaseModel
不是抽象的,则可以更改表映射以包括继承的属性:

protected override void OnModelCreating(DbModelBuilder modelBuilder) {

    modelBuilder.Entity<BaseModel>().Map(m => {
        m.ToTable("BaseModel");
    });

    modelBuilder.Entity<AccountType>().Map(m => {
        m.MapInheritedProperties();
        m.ToTable("AccountType");
    });
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder){
modelBuilder.Entity().Map(m=>{
m、 ToTable(“基本模型”);
});
modelBuilder.Entity().Map(m=>{
m、 MapInheritedProperties();
m、 ToTable(“账户类型”);
});
}

对于这样的超类型,根本不要将它们映射到数据库中。您并不希望能够在数据库中查询任何子类型的所有BaseModel类型,因为它们不是相同的实体,并且在任何业务逻辑中都不可替代


相反,只需从DbContext中删除
DbSet
属性,每个BaseModel实体子类型将分别映射和存储继承的属性。

感谢Georg的回答,获得了这个错误无法按定义映射类型“AccountType”,因为它映射使用实体拆分或其他继承形式的类型的继承属性。请选择其他继承映射策略以不映射继承属性,或将层次结构中的所有类型更改为映射继承属性而不使用拆分。“我明白了。我认为问题是因为我们试图映射抽象BaseModel造成的。您需要访问抽象实体吗?否则您只能映射
AccountType
。请参见。”