为什么AutoMapper / EF添加新项而不是关系?

时间:2009-08-12 14:21:21

标签: c# entity-framework automapper

我的测试基地有这个测试:

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 - &gt; Business - &gt; Data - &gt; EF),直接使用EF的asp.net是我们在这里无法做到的,出于模块化原因。

修改

我放弃了使用AutoMapper来完成这项工作的想法= /我没有很多实体,为了工作我需要在这个库中做的更改需要一些努力,它不是'做一些微不足道的事情。最好自己做映射。

2 个答案:

答案 0 :(得分:1)

我假设您的User对象具有Area属性,该属性也可用于建立实体之间的关系。而不是将Area.Users设置为等于新列表, 创建区域对象后,只需将User.Area设置为等于新区域。这就是我处理新实体关联的方式,它可靠地运作。

修改

如果我理解你在做什么,那么你正在创建业务对象(BO),稍后创建实体对象(EO)并将这些EO附加到上下文并保存它们。

假设我的基础知识正确,确定问题的确切原因需要查看各个BO如何创建EO并将其附加到上下文的代码。

答案 1 :(得分:0)

我的猜测(这只是猜测)是AutoMapper没有做身份解析

因此,当它在图中的不同位置看到相同的对象(用户)时,它会创建一个新对象,而不是重新使用它先前创建的对象。

这可能会解释你所看到的。

亚历