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

标签 c# design-patterns orm unit-of-work dapper

我正在使用 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 属性都是标识列。我的UoW接口(interface)定义如下:

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 外键属性然后也被插入到数据库中。我只是想知道是否有人以一种很好的通用方式解决了这类问题?

最佳答案

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

关于c# - 工作单元模式——管理父子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6305184/

相关文章:

design-patterns - 如何管理经常修改的生产代码?

c++ - 没有虚拟方法的设计模式 "Container Visitor"?

orm - RedBean:如何删除所有表中的所有行

c# - 如何使用 MVVM 为用户偏好创建程序架构

javascript - 使用 Javascript 获取空值

c# - C# 应用程序的安装程序

c# - 如何使用C#4.0从xml内容中删除特定的xml元素?

JavaScript 命名空间

java - java 'main' 应用程序中的工作单元

python - 惰性评估是如何实现的(例如在 ORM 中)