表每层次结构&继承的关系

时间:2012-12-23 12:45:15

标签: entity-framework navigation-properties table-per-hierarchy

我正在使用Entity Framework 5,目标是.Net 4.5。对于我的生活,我无法弄清楚在尝试使用Table Per Hierarchy和Navigation列时导致出现以下错误的错误:

  

列名'Game_Category'无效。
  列名称“Game_Value”无效。
  列名称“Type_Category”无效。
  列名称“Type_Value”无效。

这是抽象基类(注意类别和值上的复合PK):

[Table("Dictionary")]
public abstract class Lookup
{
  [Key, Column(Order = 0)]
  [StringLength(50)]
  public string Category { get; set; }

  [StringLength(100)]
  public string ExtendedValue { get; set; }

  [Required]
  public bool IsActive { get; set; }

  [Required]
  [StringLength(50)]
  public string Key { get; set; }

  [Key, Column(Order = 1)]
  public int Value { get; set; }
}

后面跟着两个没有添加其他列的子类...

public class Game : Lookup {}

public class SetType : Lookup {}

这是具有Game和SetType的导航属性的类......

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);
}

查找表有一个名为LookupType的鉴别器列。我已经阅读了几个关于表/继承的教程。另外两个 - 使用类似构建对象的TPT和TPC很简单。虽然我理解上面的错误 - 它按照惯例寻找FK列,但我不明白我做错了什么或者错过了导致它找到那些列的错误。我已经尝试将ForeignKey属性放在GameId和TypeId属性上,但后来我得到了关于依赖/主要关系约束的错误,我不知道如何将该类别指定为附加外键。

我还没有找到关于表/继承的教程,因为我正在使用它们。任何帮助将不胜感激,这已经让我疯了一个多小时。

更新

我认为问题在于使用Category作为关键的一部分。 CardSet没有针对该查找的“游戏”类别的两个属性或该查找的“设置类型”类别。我尝试创建这些属性,但这不起作用。是否可以使用Fluent API设置它们?到目前为止,我已经做了十几次尝试而没有任何运气。

1 个答案:

答案 0 :(得分:0)

我认为EF并不“喜欢”构造modelBuilder.Entity<Lookup>()来映射这两个子类。这应该有所帮助:

modelBuilder.Entity<Game>()
  .Map(l => l.Requires("LookupType").HasValue("Game"));
modelBuilder.Entity<SetType>()
  .Map(l => l.Requires("LookupType").HasValue("Set Type"));