Modello Unità di lavoro - gestione delle relazioni figlio genitore

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

Domanda

Sto usando un micro-orm (dapper) e sto cercando di creare un'implementazione UoW (Unit Of Work) da utilizzare per i miei repository. Sono un po 'perplesso sul modo migliore per gestire le relazioni genitore-figlio (chiave esterna) nella mia UoW. Ad esempio, se ho le seguenti due entità che mappano direttamente alle tabelle del database:

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

Dove un utente ha una relazione genitore-figlio con un ClientDatabase tramite la chiave esterna User.ClientDatabaseId. La proprietà Id su User e ClientDatabase sono colonne Identity. La mia interfaccia UoW è definita come segue:

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

Ad un certo punto, all'interno dello stesso IUnitOfWork, desidero chiamare MarkNew () sia per ClientDatabase che per Utente e quindi Commit (). Ora quello che voglio succedere è che il ClientDatabase sia salvato per primo (entità figlio) e poi per l'ID che è stato impostato su ClientDatabase, come risultato del suo inserimento nel database, da impostare come proprietà della chiave esterna ClientDatabaseId su Utente prima di esso viene quindi inserito anche nel database. Mi chiedevo solo se qualcuno avesse risolto questo tipo di problema in modo simpatico e generico?

Risposta accettata

Perché non usi semplicemente la tua User Class come Root Aggregate . Quindi, prima di fare un inserimento nel database per il codice, controlleremo se ClientDatabase non è nullo. Se non è null, è possibile controllare la proprietà Id per vedere se è un nuovo ClientDatabase o esistente (per decidere se è necessario eseguire un inserimento o un aggiornamento). È quindi possibile popolare la proprietà ClientDatabaseId.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow