我正在使用面向 .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 进行设置?到目前为止,我已经做了大约十几次尝试,但没有任何运气。