我将如何映射实体框架5中的以下关系?
public class Item { public int Id { get; set; } public int? ParentItemId { get; set; } public string Value { get; set; } public Item ParentItem { get; set; } public List<Item> ChildItems { get; set; } }
我试过这个:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Item>() .HasOptional(i => i.ParentItem) .WithMany(i => i.ChildItems) .HasForeignKey(i => i.ParentItemId); }
和这个:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Item>() .HasMany(i => i.ChildItems) .WithOptional(i => i.ParentItem) .HasForeignKey(i => i.ParentItemId); }
这都导致了这个错误:
引用约束的从属角色中的所有属性的类型必须与主体角色中相应的属性类型相同.
如果我从数据库优先映射开始,这里是生成的实体的样子:
public partial class Item { public Item() { this.ChildItems = new HashSet<Item>(); } public int Id { get; set; } public Nullable<int> ParentItemId { get; set; } public string Value { get; set; } public virtual ICollection<Item> ChildItems { get; set; } public virtual Item ParentItem { get; set; } }
我知道如果我从db-first开始,我将需要知道如何以代码优先定义关系.
解决方法
异常表示如下:
>“从属角色中的所有属性的类型”是FK属性的类型,它们是ParentItemId并具有类型int?在你的模型
>“主体角色中的相应属性类型”是PK属性的类型,它是Id,并且在模型中具有类型int
它们是一样的(无效无关紧要).但是,例外说,他们不是.
通常只有在类型不匹配的情况下才会发生异常,例如,如果PK和int有一个长(或任何其他类型)?为FK.