Patrón de unidad de trabajo: administrar las relaciones padre-hijo

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

Pregunta

Estoy usando un micro-orm (dapper) y estoy tratando de encontrar una implementación de Unidad de trabajo (UoW) para que mis repositorios la usen. Estoy un poco perplejo sobre la mejor forma de tratar las relaciones entre padres e hijos (clave externa) en mi UoW. Entonces, por ejemplo, si tengo las siguientes dos entidades que se asignan directamente a las tablas de la base de datos:

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

Donde un usuario tiene una relación padre-hijo con una base de datos del cliente a través de la clave externa User.ClientDatabaseId. La propiedad Id en User y ClientDatabase son columnas Identity. Mi interfaz UoW se define de la siguiente manera:

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

En algún momento, dentro del mismo IUnitOfWork, deseo llamar a MarkNew () tanto para una base de datos de cliente como para un usuario y luego confirmar (). Ahora lo que quiero que suceda es que la base de datos ClientDatabase se guarde primero (entidad hijo) y luego que el ID que se configuró en ClientDatabase, como resultado de su inserción en la base de datos, se establezca como la propiedad clave externa ClientDatabaseId en el usuario antes que luego también se inserta en la base de datos. Me preguntaba si alguien había resuelto este tipo de problema de una manera genérica agradable.

Respuesta aceptada

¿Por qué no usas tu clase de usuario como una raíz agregada ? Entonces, antes de hacer una inserción en la base de datos, el código verificará si ClientDatabase no es nulo. Si no es nulo, entonces podría verificar la propiedad Id para ver si es una nueva Base de Datos de Cliente o una existente (para decidir si necesita hacer una inserción o una actualización). A continuación, puede rellenar la propiedad ClientDatabaseId.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow