Entity framework 每个层次结构的表&;继承关系
我使用的是实体框架5,目标是.NET4.5。在我的一生中,我无法找出我做错了什么,在尝试使用每个层次结构的表和导航列时导致以下错误: 列名“Game_Category”无效。Entity framework 每个层次结构的表&;继承关系,entity-framework,navigation-properties,table-per-hierarchy,Entity Framework,Navigation Properties,Table Per Hierarchy,我使用的是实体框架5,目标是.NET4.5。在我的一生中,我无法找出我做错了什么,在尝试使用每个层次结构的表和导航列时导致以下错误: 列名“Game_Category”无效。 列名“Game_Value”无效。 列名“Type_Category”无效。 列名“Type\u Value”无效 下面是抽象基类(注意Category和Value上的复合PK): 后面是两个子类,它们不添加额外的列 public class Game : Lookup {} public class SetType :
列名“Game_Value”无效。
列名“Type_Category”无效。
列名“Type\u Value”无效 下面是抽象基类(注意Category和Value上的复合PK): 后面是两个子类,它们不添加额外的列
public class Game : Lookup {}
public class SetType : Lookup {}
这是一个具有游戏和设置类型导航属性的类
public class CardSet
{
[Required]
[StringLength(10)]
public string Abbreviation { get; set; }
public virtual Game Game { get; set; }
[Required]
public int GameId { get; set; }
[Key]
public int Id { get; set; }
[Required]
[StringLength(100)]
public string Name { get; set; }
[Required]
public DateTime ReleaseDate { get; set; }
public virtual Lookup Type { get; set; }
[Required]
public int TypeId { get; set; }
}
从我的数据上下文
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Lookup>()
.Map<Game>(l => l.Requires("LookupType").HasValue("Game"))
.Map<SetType>(l => l.Requires("LookupType").HasValue("Set Type"));
base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Map(l=>l.Requires(“LookupType”).HasValue(“游戏”))
.Map(l=>l.Requires(“LookupType”).HasValue(“Set Type”);
基于模型创建(modelBuilder);
}
查找表有一个名为LookupType的鉴别器列。我已经阅读了一些关于表/继承的教程。另外两个使用类似构建对象的TPT和TPC是很容易的。虽然我理解上面的错误——它按约定查找FK列,但我不理解我做错了什么或遗漏了什么导致它查找这些列。我曾尝试将ForeignKey属性置于GameId和TypeId属性之上,但随后出现了关于依赖/主体关系约束的错误,我不确定如何将类别指定为附加外键
我还没有找到一个关于表/继承的教程,在我使用导航属性时,它会对导航属性进行介绍。任何帮助都将不胜感激,这已经让我发疯一个多小时了
更新:
我认为问题在于使用类别作为键的一部分。卡片集没有两个属性用于该查找的“游戏”类别或该查找的“集合类型”类别。我尝试创建这些属性,但没有成功。是否可以使用Fluent API设置这些参数?到目前为止,我已经做了十几次尝试,但没有任何运气。我认为EF不“喜欢”构造modelBuilder.Entity()
来映射这两个子类。这将有助于:
modelBuilder.Entity<Game>()
.Map(l => l.Requires("LookupType").HasValue("Game"));
modelBuilder.Entity<SetType>()
.Map(l => l.Requires("LookupType").HasValue("Set Type"));
modelBuilder.Entity()
.Map(l=>l.Requires(“LookupType”).HasValue(“游戏”);
modelBuilder.Entity()
.Map(l=>l.Requires(“LookupType”).HasValue(“Set Type”);
我真的希望事情会这么简单。您的建议引发了一组不同的验证错误:在模型生成过程中检测到一个或多个验证错误:System.Data.Entity.Edm.EdmAssociationConstraint:关系约束中从属角色和主体角色中的属性数必须相同。但是教程显示了使用基类的实体。你说得对!所以我尝试了你的模型,没有得到任何错误。给出的代码有效(EF 5,VS2012,.Net4.5)。在我的上下文中,我只有一个DbSet
和一个DbSet
。为了简单起见,您是否还遗漏了其他类?顺便说一句,如果我们在这方面取得任何进展,我会删除这个答案,或者编辑它。我有一个完整模型的单独项目,但是当我这样做时,即使是使用上面模型的简单项目也不能工作:_dataContext.Dictionary.Where(l=>l.Category==categoryName&&l.IsActive==activeOnly);categoryName=“Game”和activeOnly=trueYeah我运气不好。我尝试了一种变通方法,将Category从键中移除,并将其设置为required,但在我的大型机型上,这种方法行不通。
modelBuilder.Entity<Game>()
.Map(l => l.Requires("LookupType").HasValue("Game"));
modelBuilder.Entity<SetType>()
.Map(l => l.Requires("LookupType").HasValue("Set Type"));