工作单元模式 - 管理父子关系

Posted

技术标签:

【中文标题】工作单元模式 - 管理父子关系【英文标题】:Unit of Work pattern - managing parent child relationships 【发布时间】:2011-06-10 10:38:15 【问题描述】:

我正在使用 micro-orm (dapper) 并试图为我的存储库提供一个工作单元 (UoW) 实现。我有点难过如何最好地处理我的 UoW 中的父子(外键)关系。因此,例如,如果我有以下两个直接映射到数据库表的实体:

public class User

    public int Id  get; set; 
    public string Email  get; set; 
    public string Password  get; set; 
    public string Name  get; set; 
    public int ClientDatabaseId  get; set; 

    public ClientDatabase ClientDb  get; set; 


public class ClientDatabase

    public int Id  get; set; 
    public string DataSource  get; set; 
    public string FailoverPartner  get; set; 
    public string InitialCatalog  get; set; 

用户通过外键 User.ClientDatabaseId 与 ClientDatabase 有父子关系。 User 和 ClientDatabase 上的 Id 属性都是 Identity 列。我的UoW接口定义如下:

public interface IUnitOfWork

    void MarkDirty(object entity);
    void MarkNew(object entity);
    void MarkDeleted(object entity);
    void Commit();
    void Rollback();

有时,在同一个 IUnitOfWork 中,我想为 ClientDatabase 和 User 调用 MarkNew(),然后调用 Commit()。现在我想要发生的事情是首先保存 ClientDatabase(子实体),然后将在 ClientDatabase 上设置的 Id 由于它的数据库插入而设置为 User 之前的 ClientDatabaseId 外键属性然后也插入到数据库中。我只是想知道是否有人以一种很好的通用方式解决了这类问题?

【问题讨论】:

【参考方案1】:

您为什么不直接使用您的用户类作为Aggregate Root。因此,在您插入数据库之前,代码将检查 ClientDatabase 是否不为空。如果不为空,那么您可以检查 Id 属性以查看它是新的 ClientDatabase 还是现有的(以确定您是否需要进行插入或更新)。然后您可以填充 ClientDatabaseId 属性。

【讨论】:

以上是关于工作单元模式 - 管理父子关系的主要内容,如果未能解决你的问题,请参考以下文章

如何使用物料清单的父子记录创建简单的数据关系

Vuex-一个专为 Vue.js 应用程序开发的状态管理模式

如何在维度模式中建模父子关系表

vue 实现数据共享模式.

为什么工厂管理那么难?

实体框架使用 Codefirst、通用存储库、工作单元模式保存多对多关系