2011-06-04 15 views
0

"EntityKeyプロパティは、プロパティの現在の値がnullの場合にのみ設定できます。"私はオブジェクトを関連オブジェクトで保存しようとします。 は、ここに私のコードです:関連オブジェクトEF 3.5でオブジェクトを保存する際の例外

public partial class Cat{ 
    public bool Save() 
    { 
     try 
     { 
      using (var context = new PhonebookEntities()) 
      { 
       if (this.ParentCat != null) 
       { 
        if (this.ParentCat.CategoryID == 0) 
         context.AddToCats(this.ParentCat); 
       } 
       context.AddToCats(this); 
       context.SaveChanges(); 
      } 
      return true; 
     } 
     catch (System.Exception) 
     { 
      return false; 
     } 
} 

そして、ここで私が猫オブジェクトを作成し、relatet親猫のオブジェクトに接続してからsaveメソッドを呼び出します。

 var cat = new Cat() 
     { 
      CatName = "Test", 
      ParentCat = Cat.GetById(1) 
     }; 
     cat.Save(); 

答えて

1

は、私は推測してみましょう - Cat.GetById(1)は次のようになります:

public static Cat GetById(int id) 
{ 
    using (var context = new PhonebookEntities()) 
    { 
      return context.Cats.Single(c => c.Id == id); 
    } 
} 

問題の原因は、2つの異なるコンテキストを使用していることです。最初のコンテキストはCatを読み込み、EntityKeyを埋めますが、2番目のコンテキストはこのインスタンスを認識しません。AddToCatsを呼び出すと、新しいCatParentCatの両方が追加されますが、新しいエンティティはEntityKeyを埋め込むことができないため失敗します新しいエンティティではありませんが、コンテキストの新しいインスタンスのためにです!)。

Addベースの操作では、常にオブジェクトグラフ内のすべての未知のエンティティを追加します。エンティティは、同じコンテキストがエンティティをロードした場合、またはそのエンティティに対して.Attachを呼び出した場合にのみ、コンテキストによって認識されます。そのための

が、これも間違っています:

if (this.ParentCat != null) 
{ 
    if (this.ParentCat.CategoryID == 0) 
     context.AddToCats(this.ParentCat); 
} 

不明ParentCatは、現在のCatと一緒に自動的に追加されます。あなたがこれを呼び出すと、現在のCatも追加されますが、次の呼び出しはそれを再び追加しようとします。=>おそらく例外が発生します。

この全体は、2つの方法によって解決することができます:あなたはCat

  • を保存するよう

    • ParentCatをロードし、いずれかのダミークラスを使用するか、EntityKeyを設定しようとしないでください同じコンテキストインスタンス上ParentCatをロード

    ダミークラスのアプローチ:

    var parentCat = new Cat() { Id = 1 }; 
    context.Cats.Attach(parentCat); // Use correct entity set name 
    var cat = new Cat() 
    { 
        CatName = "Test", 
        ParentCat = parentCat 
    }; 
    cat.Save(); 
    

    EntityKey aproach(これはより多くの推測のようなものです):

    var cat = new Cat() 
    { 
        CatName = "Test", 
        // I hope ParentCatReference will be initialized 
        ParentCatReference.EntityKey = new EntityKey("Cats", "Id", 1) // Use correct entity set name 
    }; 
    cat.Save(); 
    
  • +0

    のthnx助けのため、私はそれは今それを整理しました:) – Arnstein

    関連する問題