更新对象图时实体框架的断开行为

mar*_*ker 2 wcf disconnected-environment entity-framework-4.1 asp.net-mvc-3

我目前正在使用一个使用以下技术的项目.

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

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

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

我们还有以下对象图.

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; }
    }
Run Code Online (Sandbox Code Playgroud)

与Domain相比,我们的Dto结构更像是相同的.

我的问题:

更新对象图时例如:UpdateUser(用户用户) ; 实体框架的最佳方法是什么?

现在我们使用单个函数来保存导航数据ex: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();
    }
Run Code Online (Sandbox Code Playgroud)

在上述具有断开连接的对象图的情况下,我们可以使用Entity Framework的任何模式或最佳实践吗?

Lad*_*nka 8

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

  • 当您从服务请求收到更新的用户时,您将调用数据库并获取具有所有受影响关系的当前数据库state = user.您将使用数据库版本和更新版本来构建有效的更改集,以便最后EF将更新,插入和删除实际更改的数据.
  • 您还将修改您的DTO以运输状态,您的客户将负责设置他在DTO上所做的修改类型.您将使用此信息ChangeTracker为每个接收的实体正确配置.


Jow*_*wen 6

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