如何在 Entity Framework 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);
}
两者都会导致此错误:
引用约束的 Dependent Role 中的所有属性类型必须与 Principal Role 中相应的属性类型相同。
如果我从数据库优先映射开始,生成的实体如下所示:
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 开始这会起作用,我只需要知道如何在代码优先中定义关系。
最佳答案
在代码中首先像这样更改您的实体类:
public 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 Item ParentItem { get; set; }
public virtual ICollection<Item> ChildItems { get; set; }
}
将以下代码写入您的上下文文件:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Item>()
.HasOptional(i => i.ParentItem)
.WithMany(i => i.ChildItems)
.HasForeignKey(i => i.ParentItemId);
}
认为这应该可行。
关于c# - Entity Framework 5 Code First 自引用关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18941455/