2009-08-12 4 views
0

私は私のテストベースでこのテストを持っている:なぜ、AutoMapper/EFは関係の代わりに新しい項目を追加するのですか?

public void WorksWithAreaUsers() 
     { 
      using (new TransactionScope()) 
      { 
       //arrange 
       var userBusiness = new UserBusiness(); 
       var user = new User 
       { 
        Name = "TestUser###", 
        Login = "domain\test-user###" 
       }; 
       userBusiness.Add(user); 

       var areaBusiness = new AreaBusiness(); 
       var area = new Area 
       { 
        Name = "TestArea###", 
        Description = "Test Area Description", 
        Users = new List<User> { user } 
       }; 

       //act 
       areaBusiness.Add(area); 

       //assert 
       var areaFromDb = areaBusiness.FindById(area.AreaID); 
       Assert.IsNotNull(areaFromDb.Users); 
       Assert.IsTrue(areaFromDb.Users.Count > 0); 
       Assert.IsTrue(areaFromDb.Users.Any(c => c.UserID == user.UserID)); 
      } 
     } 

それはやっているもの:

  • 挿入をベースに、新しいユーザ。
  • ユーザー関係でベースに新しい領域を挿入します。

は、実際に何が起こる:

  • 新しいユーザーが挿入されています。
  • 新しい領域が挿入されました。
  • 新しいユーザーが領域関係で再度挿入されます。

何が起こっている可能性がありますか?

詳細情報:

  • エリアとユーザーは本当にEntityObjectsではありません。 AutoMapperを使用してDTO/Entityをマッピングしていますが、問題はこのロジックにあると思います。特定の瞬間に、私はListとEntityCollectionの間にマッピングする必要があります。私は新しいEntityCollectionを作成し、EntityCollection.Addメソッドを使用してUserをこのコレクションのUserEntityに変換します。私は新しいエンティティを作成しないためにAttachを使うべきだと思いますが、このメソッドは適切なバインディングなしでEntityCollectionから呼び出されたときは機能しません。

この問題を解決するために賢明なやり方があれば教えてください。私は本当にプロジェクト層(Web - >ビジネス - >データ - > EF)が必要です、asp.netはEFで直接作業しています。

EDIT

私はこの仕事をするAutoMapperを使用してのアイデアをあきらめ= /私は、エンティティの多くを持っていない、と順に、私はこのライブラリで行う必要があり、変更しています仕事にはいくらかの努力が必要ですが、それは簡単ではありません。自分でマッピングする方が良いです。

答えて

1

Userオブジェクトには、エンティティ間の関係を確立するためにも使用できるAreaプロパティがあると仮定します。 Area.Usersを新しいリストに設定する代わりに、エリアオブジェクトを作成した後に を追加するだけで、User.Areaを新しいエリアと同じに設定できます。これは、新しいエンティティの関連付けを処理する方法であり、確実に機能します。

EDIT

私はあなたが何をしているかを理解していれば、あなたは後でエンティティオブジェクト(EO)を作成し、コンテキストにそれらのEOを添付し、それらを保存するビジネスオブジェクト(BOS)を作成しています。

私は基本が正しいと仮定し、問題の正確な原因を判断するためには、それぞれのBOがどのようにEOを作成し、それらをコンテキストに付加するかについてのコードを参照する必要があります。

+0

これは多対多の関係です。それは何か変わるのだろうか? –

+0

その場合は、Users.Add(user)またはuser.Areas.Add(Area)タイプのロジックを実行してみてください。 –

0

私の推測(とそれだけで推測です)AutoMapperが、それは、グラフ内の別の場所で同じオブジェクト(ユーザー)を見たときに、それは新しいオブジェクトを作成するのではなく、アイデンティティ解像度

をやっていないことです前に作成したオブジェクトを再使用します。

これはおそらくあなたが見ているものを説明するでしょう。

アレックス

関連する問題