【问题标题】:Why is AutoMapper/EF adding a new item instead of a relationship?为什么 AutoMapper/EF 添加新项目而不是关系?
【发布时间】: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


    【解决方案1】:

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

    编辑

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

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

    【讨论】:

    • 这是一个多对多的关系。它会改变什么吗?
    • 在这种情况下,尝试执行 Users.Add(user) 或 user.Areas.Add(Area) 类型的逻辑。
    【解决方案2】:

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

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

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

    亚历克斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 2021-05-15
      • 2022-01-03
      • 2017-11-13
      • 2019-06-16
      • 1970-01-01
      相关资源
      最近更新 更多