テストベースにこのテストがあります:
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));
}
}
それが何をしているのか:
- 新しいユーザーをベースに挿入します。
- ユーザー関係を使用して、新しい領域をベースに挿入します。
実際に何が起こるか:
- 新しいユーザーが挿入されます。
- 新しい領域が挿入されます。
- 新しいユーザーがエリア関係で再度挿入されます。
何が起こっている可能性がありますか?
詳しくは:
- Area と User は実際には EntityObject ではありません。AutoMapper を使用して DTO/Entity をマッピングしていますが、問題はこのロジックにあると思います。ある時点で、List と EntityCollection の間でマッピングを行う必要があります。新しい EntityCollection を作成し、EntityCollection.Add メソッドを使用して、このコレクションに UserEntity に変換された User を配置します。新しいエンティティを作成しないためには Attach を使用する必要があると思いますが、適切なバインドなしで EntityCollection から呼び出された場合、このメソッドは機能しません。
それより賢い何か、またはこの問題を解決するための回避策を提案しますか? プロジェクト レイヤー (Web -> ビジネス -> データ -> EF) が本当に必要です。モジュール性の理由から、EF と直接連携する asp.net はここでは実行できません。
編集:
AutoMapper を使用してこの仕事を行うという考えをあきらめています =/ 私は多くのエンティティを持っておらず、機能させるためにこのライブラリで行う必要がある変更にはいくらかの努力が必要です。それは些細なことではありませんする。自分でマッピングを行う方が良いです。