【发布时间】:2015-01-22 08:10:23
【问题描述】:
我正在尝试首先使用 EF4.1 代码进行一对多自引用。我的实体看起来像这样
public class Site
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Sitename { get; set; }
public virtual Site ChildSite { get; set; }
public virtual ICollection<Site> ChildSites { get; set; }
}
在我的上下文类中,我这样做是为了进行自我引用
modelBuilder.Entity<Site>()
.HasOptional(s => s.ChildSite)
.WithMany(s => s.ChildSites)
.HasForeignKey(s => s.ParentId);
但是当我尝试使用此代码向我的数据库添加一些虚拟数据时
var sites = new List<Site>
{
new Site { ParentId = 0, Sitename = "Top 1" },
new Site { ParentId = 0, Sitename = "Top 2" },
new Site { ParentId = 0, Sitename = "Top 3" },
new Site { ParentId = 0, Sitename = "Top 4" },
new Site { ParentId = 1, Sitename = "Sub 1_5" },
new Site { ParentId = 1, Sitename = "Sub 1_6" },
new Site { ParentId = 1, Sitename = "Sub 1_7" },
new Site { ParentId = 1, Sitename = "Sub 1_8" },
new Site { ParentId = 2, Sitename = "Sub 2_9" },
new Site { ParentId = 2, Sitename = "Sub 2_10" },
new Site { ParentId = 2, Sitename = "Sub 2_11" },
new Site { ParentId = 2, Sitename = "Sub 2_12" },
new Site { ParentId = 3, Sitename = "Sub 3_13" },
new Site { ParentId = 3, Sitename = "Sub 3_14" },
new Site { ParentId = 3, Sitename = "Sub 3_15" },
new Site { ParentId = 3, Sitename = "Sub 3_16" },
new Site { ParentId = 4, Sitename = "Sub 4_17" },
new Site { ParentId = 4, Sitename = "Sub 4_18" },
new Site { ParentId = 4, Sitename = "Sub 4_19" },
new Site { ParentId = 4, Sitename = "Sub 4_20" }
};
sites.ForEach(s => context.Sites.Add(s));
context.SaveChanges();
我得到这个错误:
无法确定主端 'Cms.Model.Site_ChildSite' 关系。多个添加的实体可能 具有相同的主键。
我在这里错过了什么?
编辑:
这是我的问题的解决方案。我从实体中删除了public virtual Site ChildSite { get; set; }
public class Site
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Sitename { get; set; }
public virtual ICollection<Site> ChildSites { get; set; }
}
然后我把 modelBuilder 改成了这个
modelBuilder.Entity<Site>()
.HasMany(s => s.ChildSites)
.WithOptional()
.HasForeignKey(s => s.ParentId);
由于数据库的自动生成似乎不起作用,我继续像这样自己创建了表
int Id, not null, primary key
int ParentId, null
string Sitename, null
一切都如我所愿。
第二次编辑
以及让虚拟数据的自动生成工作的最后一步
var parent1 = new Site
{
Sitename = "Top 1",
ChildSites = new List<Site>
{
new Site {Sitename = "Sub 1_5"},
new Site {Sitename = "Sub 1_6"},
new Site {Sitename = "Sub 1_7"},
new Site {Sitename = "Sub 1_8"}
}
};
ect . . .
context.Sites.Add(parent1);
context.SaveChanges();
请参阅下面的 Slauma 答案
【问题讨论】:
-
您是否假设“Top 1”..“Top 4”的 ID 为 1 到 4?情况可能并非如此。 EF 无法假设,因此它不知道如何在插入时“连接”行。
-
为什么你有两个属性
ChildSite和ChildSites? -
Matt >> 好的,我不知道,我尝试手动添加数据,它起作用了;o)
标签: entity-framework entity-framework-4.1 ef-code-first