Domanda

Io sto usando un micro-orm (Dapper) e sto cercando di trovare un'unità di lavoro (UoW) implementazione per i miei repository da utilizzare. Sono un po 'perplesso il modo migliore per trattare con genitore-figlio (chiave esterna) relazioni nella mia UoW. Così, per esempio, se ho le seguenti due entità che mappano direttamente a tabelle di 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; }
}

Quando un utente ha relazione padre-figlio con una ClientDatabase tramite l'User.ClientDatabaseId chiave esterna. La proprietà ID sia utente e ClientDatabase sono colonne di identità. La mia interfaccia UoW è definito come segue:

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

A un certo punto, all'interno della stessa IUnitOfWork voglio chiamare MarkNew () sia per un ClientDatabase e un utente e quindi eseguire il commit (). Ora quello che voglio che accada è per il ClientDatabase da salvare prima (entità figlio) e poi per l'ID che è stata impostata su ClientDatabase, a seguito dell'inserimento del database lo è, deve essere impostato come il ClientDatabaseId proprietà chiave esterna su Utente prima che viene quindi inserito anche nel database. Mi chiedevo se qualcuno aveva risolto questo tipo di problema in una bella maniera generica?

È stato utile?

Soluzione

Perché non basta usare la tua classe utente come un Aggregate Root . Quindi, prima di fare un inserto al database per il codice controllerà se il ClientDatabase non è nullo. Se non è nullo, allora si potrebbe verificare la proprietà Id per vedere se un nuovo ClientDatabase o di uno esistente (per decidere se avete bisogno di fare un inserimento o un aggiornamento). Si potrebbe quindi popolare la proprietà ClientDatabaseId.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top