0

我正在使用面向 .Net 4.5 的 Entity Framework 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 作为 key 的一部分。CardSet 没有用于该查找的“游戏”类别或用于该查找的“设置类型”类别的两个属性。我尝试创建这些属性,但没有奏效。是否可以使用 Fluent API 进行设置?到目前为止,我已经做了大约十几次尝试,但没有任何运气。

4

1 回答 1

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"));
于 2012-12-23T15:39:06.787 回答