0

我的测试库中有这个测试:

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 来完成这项工作的想法 =/ 我没有很多实体,并且我需要在这个库中做的更改才能工作需要一些努力,这不是一件小事去做。最好自己做映射。

4

2 回答 2

1

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

编辑

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

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

于 2009-08-12T14:30:56.160 回答
0

我的猜测(这只是一个猜测)是 AutoMapper 没有进行身份解析

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

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

亚历克斯

于 2009-08-12T16:00:05.760 回答