2012-04-13 7 views
0

linq2sqlを使用してエンティティを更新するベストプラクティスは何ですか?Linq2SQLのエンティティを更新するベストプラクティスは何ですか?

もう少し詳しくundestandしてください。

記事から理解したように、エンティティはスクラッチ(または既存のエンティティ)から構築されたコンテキストとエンティティに付加されている2つの状況があります。

var orders = GenericRepository.Instance.Find<BuyerOrder>(b => b.ID == 2).FirstOrDefault(); 
orders.Price = 397809; 
GenericRepository.Instance.Save(orders); 

オブジェクトがすでにに添付されています。私は、コードを実行すると、当然のことながら

public virtual void Save<T>(T value) where T : class 
{ 
     Context.GetTable<T>().Attach(value); 
     Context.Refresh(RefreshMode.KeepCurrentValues, value); 
     Context.SubmitChanges(); 
} 

:私はentitesを更新する唯一の方法、それは今のところ次のように実装されていますが持っていると思いました文脈と私は例外を持っています:

Cannot attach an entity that already exists. 

保存する前にオブジェクトを必ず離すべきですか?この問題を克服する別の方法がありますか?

申し訳ありませんが、質問がダムである場合 - これは表を添付していない、あなたのSave方法ではlinq2sql

答えて

1

と私の最初の経験です。また、タイプを取る必要はありません。Context.SubmitChangesをSaveメソッドの中で呼び出すことができます。ような何か:

public void Save() 
{ 
    Context.SubmitChanges(); 
} 

は、その後の操作を行います。

var orders = GenericRepository.Instance.Find<BuyerOrder>(b => b.ID == 2).FirstOrDefault(); 
orders.Price = 397809; 
GenericRepository.Instance.Save(); 

は、いくつかのより多くの例については、MSDNを参照してください:http://msdn.microsoft.com/en-us/library/bb386931.aspx

+1

この正解です。エンティティを切り離したり、トリックを演じたりしないでください。個々のエンティティを「保存」しないでください。オブジェクトグラフ全体を変更し、最後にSaveChangesを呼び出します。 – usr

+0

お返事ありがとうございます。しかし、エンティティがコンテキストに添付されていることをどのように定義できますか?エンティティがコンテキストにアタッチされているときとそうでないときの2つの状況を処理したい場合 –

+0

エンティティがアタッチされているかどうかは、この質問に記載されている答えを使用して定義できます。http://stackoverflow.com/questions/6493737/how-do-i-check-a-linq-to-sql-object-is-already-attach-a-datacontext – mattytommo

1

あなたは実体がこのように装着されているかどうかを確認することができます。

if (!Context.GetTable<T>().IsAttached(value)) 
{ 
    Context.GetTable<T>().Attach(value); 
} 
Context.Refresh(RefreshMode.KeepCurrentValues, value); 
Context.SubmitChanges(); 
+0

申し訳ありませんが、多分私は誤解を誤解しました。 ContextのメソッドIsAttchedが表示されません。 –

関連する問題