2011-06-10 62 views
8

我正在使用微型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内我想打电话给MarkNew()两个一ClientDatabase和用户,然后提交()。现在我想要发生的事情是,首先保存ClientDatabase(子实体),然后为ClientDatabase上设置的Id(作为其数据库插入的结果)在User之前设置为Client上的ClientDatabaseId外键属性然后也被插入到数据库中。我只是想知道是否有人用一种很好的通用方式解决了这类问题?

回答

5

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