我正在使用微型Orm(精简程序),并试图提出一个工作单元(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界面定义如下:

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是否不为null。如果不为null,则可以检查Id属性以查看其是新的ClientDatabase还是现有的ClientDatabase(以确定是否需要进行插入或更新)。然后,您可以填充ClientDatabaseId属性。

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

10-10 06:01