我目前正在处理一个使用以下技术的项目。
- ASP.net MVC - 表示层
- 数据服务层 - (WCF)
- 具有自动映射器的数据传输对象 (DTO) 层
- 领域层(POCO,代码优先实体框架)
- 存储库层 + 实体框架 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();
}
在上述情况下,是否有任何模式或最佳实践可以与实体框架一起使用断开对象图?