我不明白为什么这个配置不会向数据库生成插入语句。我正在通过 SQL Profiler 进行检查。
这是我通过 Visio 制作的模型:
这是我的 edmx(首先是数据库)。圆圈显示返回到 GeoBoundary 的自引用关系。
这是我的代码:
public void UpdateAssocs(Dictionary<int, List<int>> fromTo) {
//iterate through each dictionary entry
foreach (KeyValuePair<int, List<int>> entry in fromTo) {
using (TransactionScope scope = new TransactionScope()) {
//get a reference to the parent geoboundary for this entry
GeoBoundary parent = contactContext.GeoBoundaries
.FirstOrDefault(x => x.GeoID == entry.Key);
//test to see if the parent is null, it shouldn't be b/c this dictionary was generated
// from a list of database values (but shit happens so throw an error if it is null)
if (parent != null) {
foreach (int childID in entry.Value) {
//check to see if the child exists in the parents list of children
GeoBoundary child = parent.GeoBoundaryAssocTo
.FirstOrDefault(x => x.GeoID == childID);
if (child == null) {
//get a ref to the GeoBoundary that SHOULD be tied to the parent (it should exist but there just
// isn't an established relationship in the db)
child = contactContext.GeoBoundaries
.FirstOrDefault(x => x.GeoID == childID);
//check the damn thing again b/c you never want to assume...
// but if it's still null then do nothing!
if (child != null) {
parent.GeoBoundaryAssocTo.Add(child);
contactContext.SaveChanges();
}
}
}
}
else {
throw new Exception(@"Parent GeoID passed to UpdateAssocs method or GeoID is null.");
}
scope.Complete();
}
}
}
当我进入parent.GeoBoundaryAssocTo.Add(child);
调试器时,我确保父母和孩子都存在,然后我逐步完成,但在探查器中什么也没有。是什么赋予了?两个实体都已经存在于数据库中并且除了关系之外我没有改变任何东西,这是一个问题吗?如果是这样,那么我如何将关系标记为已更改,以便 EF 生成插入?
EDMX 详细信息:
<AssociationSet Name="GeoBoundaryAssociation" Association="Contact.GeoBoundaryAssociation">
<End Role="GeoBoundary" EntitySet="GeoBoundaries" />
<End Role="GeoBoundary1" EntitySet="GeoBoundaries" />
</AssociationSet>
<Association Name="GeoBoundaryAssociation">
<End Type="Contact.GeoBoundary" Role="GeoBoundary" Multiplicity="*" />
<End Type="Contact.GeoBoundary" Role="GeoBoundary1" Multiplicity="*" />
</Association>