3

我目前正在处理一个使用以下技术的项目。

  1. ASP.net MVC - 表示层
  2. 数据服务层 - (WCF)
  3. 具有自动映射器的数据传输对象 (DTO) 层
  4. 领域层(POCO,代码优先实体框架)
  5. 存储库层 + 实体框架 4.3 + DbContext。

我们使用 DTO 使用自动映射器反之转换域对象,并使用 WCF 服务发送到前端。

此外,我们在 WCF 层为每个请求创建基于每个请求的 DBContext,我们的 WCF 服务上下文是由客户端 DTO 中的 Per Call 和 No Tracking enable 构造的,并且它是完全断开的。

我们也有以下对象图。

public class User : BaseEntity
    {
        public virtual Identity Identity { get; set; }

        public string UserName { get; set; }

        public string Password { get; set; }

        public int IdentityId { get; set; }

        public virtual IList<Group> Groups{ get; set; }
    }



 public class Identity : BaseEntity
    {
        public string FirstName { get; set; }

        public string LastName { get; set; }

        public virtual IList<Email> Emails { get; set; }

        public virtual IList<PhoneNumber> PhoneNumbers { get; set; }
    }

与域相比,我们的 Dto 结构更像相同。

我的问题:

当涉及到更新对象图例如:UpdateUser(User user) ; Entity Framework 的最佳方法是什么?

现在我们使用单个函数来保存导航数据,例如:UpdateEmail(userId, Email)(只保存原始数据而不是关系);因此,当我们考虑一个 UnitOfWork 时,它会在数据库中进行大量插入和更新。

当前实现如下

  public void UpdateUser(User user)
    {
    UpdateEmail(user.userId, user.Idenity.Emails);
    UpdatePhone(user.userId, user.Identity.PhoneNumbers);

    etc.............

    UpdateUser(user);
    UnitOfWork.Commit();// Calling DbContext.SaveChanges();
    }

在上述情况下,是否有任何模式或最佳实践可以与实体框架一起使用断开对象图?

4

3 回答 3

10

解决它的选择并不多。EF 没有任何直接支持更新断开连接的对象图。您必须编写更新逻辑,通常有两种方法:

  • 当您从服务请求中收到更新的用户时,您将调用数据库并获取当前数据库状态 = 具有所有受影响关系的用户。您将使用数据库版本和更新版本来构建有效的更改集,因此最终 EF 将仅更新、插入和删除真正更改的数据。
  • 您还将修改您的 DTO 以传输状态,并且您的客户将负责设置他对 DTO 所做的修改类型。您将使用此信息正确配置ChangeTracker每个收到的实体。
于 2012-06-18T11:23:19.277 回答
6

Julie Lerman 在一些视频中很好地解释了这一点

于 2013-01-08T13:00:39.237 回答
0

现在您的问题是您使用 EF 并且需要大量更新吗?我在这里看不到解决方法,因为您的电话号码和电子邮件是单独的表格。您可以为包含前五个的用户创建一个扁平实体,并映射到插入的过程。它会减少电话,但不是最干净的恕我直言。如果您同时处理许多用户,那么可能会分解 UO​​W 以仅针对每个用户执行操作,这样您的交易就会更短。当前是否存在性能问题或只是未来的问题?——</p>

如果没有展平,您与不使用 EF 的情况没有什么不同。我不明白为什么认为因为您使用的是 DDD,所以您不能引入特定于数据映射的实体。您的实体仍然可以使用,您只是另外有一个带有映射的新实体。实际上,您可以稍后在存储库中没有实体的情况下执行此操作(存储库查询更改的对象、展平并发送到数据访问层以调用 proc)

于 2012-06-18T14:34:27.543 回答