私は私のテストベースでこのテストを持っている:なぜ、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を使用してのアイデアをあきらめ= /私は、エンティティの多くを持っていない、と順に、私はこのライブラリで行う必要があり、変更しています仕事にはいくらかの努力が必要ですが、それは簡単ではありません。自分でマッピングする方が良いです。
これは多対多の関係です。それは何か変わるのだろうか? –
その場合は、Users.Add(user)またはuser.Areas.Add(Area)タイプのロジックを実行してみてください。 –