我的测试基地有这个测试:
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));
}
}
它在做什么:
实际发生的事情:
可能会发生什么?
更多信息:
您是否建议任何比这更聪明或解决此问题的解决方法?我真的需要项目层(Web - &gt; Business - &gt; Data - &gt; EF),直接使用EF的asp.net是我们在这里无法做到的,出于模块化原因。
修改:
我放弃了使用AutoMapper来完成这项工作的想法= /我没有很多实体,为了工作我需要在这个库中做的更改需要一些努力,它不是'做一些微不足道的事情。最好自己做映射。
答案 0 :(得分:1)
我假设您的User对象具有Area属性,该属性也可用于建立实体之间的关系。而不是将Area.Users设置为等于新列表, 创建区域对象后,只需将User.Area设置为等于新区域。这就是我处理新实体关联的方式,它可靠地运作。
修改强>
如果我理解你在做什么,那么你正在创建业务对象(BO),稍后创建实体对象(EO)并将这些EO附加到上下文并保存它们。
假设我的基础知识正确,确定问题的确切原因需要查看各个BO如何创建EO并将其附加到上下文的代码。
答案 1 :(得分:0)
我的猜测(这只是猜测)是AutoMapper没有做身份解析
因此,当它在图中的不同位置看到相同的对象(用户)时,它会创建一个新对象,而不是重新使用它先前创建的对象。
这可能会解释你所看到的。
亚历