2012-03-12 11 views
2

私はクラスが3つあります:
BasePlace, Hall, HallPlanです。オブジェクトを更新するLinqToSql

関係:
BasePlace - Hall:1対多。
Hall - HallPlan:1対多。

私はリモートプログラムから場所(会場)を取得します。オブジェクトを追加(または更新)する次の方法があります。

public void AddPremieraPlace(IEnumerable<BasePlace> places) 
     { 
      if(places != null) 
      { 
       foreach (var place in places) 
       { 
        //is exist in db 
        var dbPlace = Database.BasePlaces.FirstOrDefault(p => p.OIDPremiera == place.OIDPremiera); 
        // if exist update properties and collections 
        if (dbPlace != null) 
        { 
         dbPlace.Name = place.Name 
         dbPlace.Halls = place.Halls; 
        } 
        else 
         Add(place); // just add new place 

        Database.SubmitChanges();      
       } 

      } 
     } 

DBに場所が存在すると、更新が正しく動作しません。 HallHallPlanで重複作成されます。 Hallテーブル、例えば:

OID Name  PlaceId OIDPremiera 
19 Redisson  NULL  1 
20 Test 2   NULL  3 
21 Test 3   NULL  2 

22 Redisson  5   1 
23 Test 2   5   3 
24 Test 3   5   2 

正しく更新する方法は?おかげさまで

Add()

public virtual void Add(TClass entity) 
     { 
      Check.Argument.IsNotNull(entity, "entity"); 

      Database.GetTable<TClass>().InsertOnSubmit(entity); 
     } 
+0

'PlaceId'カラムは' BasePlace'テーブルの外部キーですか?重複する行は '22'と' 24'の間の 'OID'を持つ行ですか? –

+0

あなたのadd()は何をしますか? – Pleun

+0

@EnricoCampidoglio:はい、それはFKです。はい、22-24の間で複製してください。 – user348173

答えて

3

LINQツーSQLは、Identity Managerを持っています。ツリー内でを認識しない(つまり、IDマネージャにない)何かを見つけた場合、それはそのアイテムの挿入として扱われるものとみなされます。したがって、Hallインスタンスが認識されないため、インスタンスが挿入されています。

これに対処するには2通りの方法があります。

  • むしろ直接L2Sモデルにあなたの非L2SモデルからHallsを割り当てるよりも、あなたがインスタンスをマッチングためのデータ・コンテキストを求めることができる、すなわちループ内で、データ・コンテキストから同等Hallを取得し、代わりに元
  • 前に会場インスタンスのL2Sに認識させるために(すなわちctx.Halls.Attach(...)Attachメソッドを使用することをを追加するためにctx.Halls.FirstOrDefault(...)を使用あなたが始める
+0

以下を追加します: 'Database.BasePlaces.Attach(place);'。エラーはありませんが、DBに変更はありません。 – user348173

+0

@ user348173添付する*場所*ではありません。 *ホール*、ノーですか? –

+0

私は 'Place'とすべてのコレクション:' Place.Halls'をしたいです。 「Hall」には、「HallPlans」というコレクションがあります。 – user348173

関連する問題