工作单元模式-管理父子关系
本文关键字:管理 父子关系 模式 单元 工作 | 更新日期: 2023-09-27 17:58:46
我正在使用一个微表单(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与ClientDatabase具有父子关系。客户端数据库Id。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属性。