Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 每个层次结构的表&;继承关系_Entity Framework_Navigation Properties_Table Per Hierarchy - Fatal编程技术网

Entity framework 每个层次结构的表&;继承关系

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 :

我使用的是实体框架5,目标是.NET4.5。在我的一生中,我无法找出我做错了什么,在尝试使用每个层次结构的表和导航列时导致以下错误:

列名“Game_Category”无效。
列名“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"));