【发布时间】:2009-08-12 14:21:21
【问题描述】:
我的测试库中有这个测试:
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),asp.net 直接使用 EF 是我们在这里无法做到的,因为模块化的原因。
编辑:
我放弃了使用 AutoMapper 来完成这项工作的想法 =/ 我没有很多实体,并且我需要在这个库中做的更改才能工作需要一些努力,它不是做些微不足道的事。最好自己做映射。
【问题讨论】:
标签: c# entity-framework automapper