2011-06-10 21 views
8

Mikro-orm (dapper) kullanıyorum ve kullanacak depolarım için bir Birim İş (UoW) uygulaması geliştirmeye çalışıyorum. UoW'mdaki ebeveyn-çocuk (yabancı anahtar) ilişkilerini en iyi nasıl ele alacağımı biraz şaşırdım. Ben veritabanı tablolarına doğrudan eşleme iki tarafını aşağıdaki varsa örneğin Yani: Bir Kullanıcı yabancı anahtar User.ClientDatabaseId üzerinden bir ClientDatabase ile ebeveyn-çocuk ilişkisi vardırÇalışma deseni birimi - ana çocuk ilişkileri yönetme

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; } 
} 

. Hem User hem de ClientDatabase'deki Id özelliği Kimlik sütunlarıdır. şöyle My UOW arayüzü tanımlanır: Bir noktada

public interface IUnitOfWork 
{ 
    void MarkDirty(object entity); 
    void MarkNew(object entity); 
    void MarkDeleted(object entity); 
    void Commit(); 
    void Rollback(); 
} 

, aynı IUnitOfWork içinde ben() Bir ClientDatabase ve bir Kullanıcı ikisi için MarkNew() çağırın ve daha sonra Commit istiyorum. Şimdi olmak istediğim, ClientDatabase'in ilk önce (alt varlık) ve daha sonra ClientDatabase üzerinde ayarlanan ve veritabanı ekleme işleminin bir sonucu olarak, önceki kullanıcı üzerinde ClientDatabaseId yabancı anahtar özelliği olarak ayarlanmasıdır. daha sonra veritabanına eklenir. Ben sadece kimsenin bu tür bir problemi genel bir tarzda çözüp çözmediğini merak ettim.

cevap

5

Neden User Class'ınızı Aggregate Root olarak kullanmıyorsunuz? Bu nedenle, kod için veritabanına bir ekleme yapmadan önce ClientDatabase'in boş olmadığını kontrol eder. Eğer boş değilse, yeni bir ClientDatabase veya varolan bir tanesini (ekleme veya güncelleştirme yapıp yapmayacağınıza karar vermek için) görmek için Id özelliğini kontrol edebilirsiniz. Daha sonra ClientDatabaseId özelliğini doldurabilirsiniz.

İlgili konular