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

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

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

一般承认的答案

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow