1

我不明白为什么这个配置不会向数据库生成插入语句。我正在通过 SQL Profiler 进行检查。

这是我通过 Visio 制作的模型:

视觉模型

这是我的 edmx(首先是数据库)。圆圈显示返回到 GeoBoundary 的自引用关系。

edmx模型

这是我的代码:

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>
4

2 回答 2

1

您需要确保您的导航属性附加到当前 DBContext。否则 EF 将忽略它。

试试这个:

...

//get a reference to the parent geoboundary for this entry
GeoBoundary parent = contactContext.GeoBoundaries
    .include("GeoBoundaryAssocTo")
    .FirstOrDefault(x => x.GeoID == entry.Key);

...
// You may need to use include on your child entity too.
于 2013-01-02T17:49:01.367 回答
0

好吧,我是我自己不幸的根源。我没有意识到我正在重用我的contactContext(实例化为服务类),并且在我之前设置的方法方法调用中AutoDetectChangesEnabled = false;。我需要做的就是重新打开更改跟踪。不知何故,我从来没有想过服务类在以前的调用中保持了它的状态。活到老,学到老。

于 2013-01-03T13:30:43.463 回答