asp.net-mvc-3 - 更新对象图时 Entity Framework 的断开行为

标签 asp.net-mvc-3 wcf entity-framework-4.1 disconnected-environment

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

  • ASP.net MVC - 表示层
  • 数据服务层 - (WCF)
  • 带自动映射器的数据传输对象 (DTO) 层
  • 域层(POCO,代码优先 Entity Framework )
  • 存储库层 + Entity Framework 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 结构更像是相同的。

    我的问题:

    更新对象图例如:更新用户(用户用户) ; 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();
        }
    

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

    最佳答案

    没有多少选项可以解决它。 EF doesn't have any direct suppor t 用于更新断开连接的对象图。您必须编写更新逻辑,通常有两种方法可以做到:

  • 当您从服务请求收到更新的用户时,您将调用数据库并获取当前数据库状态 = 用户以及所有受影响的关系。您将使用数据库版本和更新版本来构建有效的更改集,因此最后 EF 将仅更新、插入和删除真正更改的数据。
  • 您还将修改您的 DTO 以传输状态,您的客户将负责设置他在 DTO 上所做的修改类型。您将使用此信息正确配置 ChangeTracker对于每个接收到的实体。
  • 关于asp.net-mvc-3 - 更新对象图时 Entity Framework 的断开行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11078126/

    相关文章:

    c# - HTML 解码和编码

    WCF超时客户端与服务器

    WCF 的 endpointConfigurationName 应该是什么?

    database - 如何为 Entity Framework 创建有效的连接字符串 - 底层提供程序在打开时失败?

    c# - Entity Framework 和 MVC 模型

    c# - 使用 Code First EF4.1 保存时如何将默认值添加到属性?

    javascript - 如何将带有 html 片段的 javascript 加载到现有的 Web 应用程序中

    asp.net-mvc-3 - Ninject:选择错误的构造函数

    c# - 带逗号的百分比正则表达式

    c# - 我可以强制 svcutil.exe 为 WCF 服务生成数据协定吗?