我的测试库中有这个测试:
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 并不是真正的实体对象。我正在使用 AutoMapper 映射 DTO/Entity,我认为问题出在这个逻辑上。在某个时刻,我必须在 List 和 EntityCollection 之间进行映射。我创建了一个新的 EntityCollection 并使用 EntityCollection.Add 方法将转换为 UserEntity 的用户放入此集合中。我认为我应该使用 Attach 来不创建新实体,但是在没有正确绑定的情况下从 EntityCollection 调用此方法时不起作用。
你有什么比这更聪明的建议,或者解决这个问题的任何解决方法吗?我真的需要项目层(Web -> 业务 -> 数据 -> EF),出于模块化原因,我们无法在此处直接使用 EF 的 asp.net。
编辑:
我放弃了使用 AutoMapper 来完成这项工作的想法 =/ 我没有很多实体,并且我需要在这个库中做的更改才能工作需要一些努力,这不是一件小事去做。最好自己做映射。