1

この構成でデータベースへの挿入ステートメントが生成されない理由がわかりません。SQL プロファイラで確認しています。

これが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 に答える