C# 在EF code first MVC中从基类正确创建表结构
我有一个DB集合模型,它继承自基类模型,如下所示 基类: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;
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
。请参见。”