2017-06-17 3 views
0

私はlocalDBをC#で使用していますが、いくつかのクラス(コンテキストクラス)は別のクラスの属性を持っていますが、そのオブジェクトを永続化すると属性クラス(class_id)の参照を保存しません。 (bothsを永続)C#なぜオブジェクトレコードが重複しているのですか?

public class Item 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public String Name { get; set; } 
} 

public class Order 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public Item Item { get; set; } 
} 

どちらのクラスが同じルーチンが持続する基本的な行う余分なコントロールクラスを持っている:

public void SaveObjeto(ObjectClass object) 
    { 
     if (object.Id == 0) 
     { 
      ctx.Objects.Add(objeto); 
     } 
     else 
     { 
      var temp = ctx.Objects.SingleOrDefault(
          temp => temp.Id == objeto.Id 
         ); 
      temp.Id = objeto.Id; 
      temp.Attribute = objeto.Attribute; 
     } 

     ctx.SaveChanges(); 
    } 

私は存続するためにLINQの式を使用します。

実用的な例:私はクラスアイテム1がうまくLocalDBに存続している

  • 次に、属性Item1を持つOrder1を永続化しようとします。
  • 永続的なOrder1は、永続化されたItem1を参照するのではなく、Item1(クローン?)として別のレコードを作成します。
  • 結局のところ、私は2つのItem1がLocalDB上に残っていることに固執しています。

なぜですか?

答えて

0

新しいOrderインスタンスが作成されるたびに、Item1の新しいインスタンス(おそらくデータベース内の永続レコードのIDと同じID)を使用するように見えます。しかし、EFはそれを新たに追加されたオブジェクトとして追跡します。そこのオプションのカップルです:

  1. ロードアイテム1デシベルの文脈からはとEFは、エンティティがすでにTBEデータベースに永続化されていることを知ることができます順序インスタンスにプロパティを割り当てるためにそれを使用します。

  2. EFがそれをスキップするように、Item1をUnchanged/DetachedとExplcitlyマークします。

    ctx.Entry(order.Item).State = System.Data.Entity.EntityState.Unchanged; 
    
+0

おかげで、私は論文のヒントのために打撃を与えるつもり。 –

+0

両方のソリューションは私のためにうまくいきました。私は2番目のソリューションを使用します。ありがとう。 –

+0

しかし、オブジェクト属性にまだオブジェクト属性がある場合は、彼に変更のないマークを付けるのではなく、コンテキストから彼を回復させる方がよいでしょう。 –

関連する問題