Arbeitseinheitsmuster - Verwalten von übergeordneten untergeordneten Beziehungen

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

Frage

Ich benutze ein Mikro-Orm (Dapper) und versuche, eine Unit Of Work (UoW) Implementierung für meine Repositories zu erstellen. Ich bin ein bisschen ratlos, wie man am besten mit Eltern-Kind-Beziehungen (Fremdschlüssel) in meiner UoW ​​umgehen kann. Also zum Beispiel, wenn ich die folgenden zwei Entitäten habe, die direkt zu Datenbanktabellen gehören:

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

Wo ein Benutzer eine Parent-Child-Beziehung mit einer ClientDatenbank über den Fremdschlüssel User.ClientDatabaseId hat Die Id-Eigenschaft in der Benutzer- und der Clientdatenbank sind Identitätsspalten. Meine UoW-Schnittstelle ist wie folgt definiert:

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

Irgendwann möchte ich im selben IUnitOfWork MarkNew () sowohl für eine ClientDatenbank als auch für einen Benutzer und dann für Commit () aufrufen. Jetzt möchte ich, dass die ClientDatenbank zuerst gespeichert wird (untergeordnete Entität) und dann die ID, die in ClientDatabase als Ergebnis ihrer Datenbankeinfügung festgelegt wurde, als Fremdschlüsseleigenschaft ClientDatabaseId für den Benutzer davor festgelegt wird wird dann ebenfalls in die Datenbank eingefügt. Ich habe mich nur gefragt, ob irgendjemand diese Art von Problem auf eine nette generische Art und Weise gelöst hat?

Akzeptierte Antwort

Warum verwenden Sie Ihre Benutzerklasse nicht einfach als Aggregatwurzel? Bevor Sie also eine Einfügung in die Datenbank für den Code durchführen, prüfen Sie, ob die ClientDatenbank nicht null ist. Wenn nicht null, können Sie die ID-Eigenschaft überprüfen, um festzustellen, ob es sich um eine neue ClientDatabase oder eine vorhandene handelt (um zu entscheiden, ob Sie eine Einfügung oder ein Update durchführen müssen). Sie könnten dann die ClientDatabaseId-Eigenschaft auffüllen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow