2011-06-10 11 views
8

Estoy usando un micro-orm (dapper) y estoy tratando de encontrar una implementación de unidad de trabajo (UoW) para el uso de mis repositorios. Estoy un poco perplejo sobre la mejor forma de tratar las relaciones entre padres e hijos (clave externa) en mi UoW. Así, por ejemplo si tiene las dos entidades que se asignan directamente a las tablas de bases de datos:Patrón de unidad de trabajo: administración de las relaciones padre-hijo

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

Cuando un usuario tiene relación padre-hijo con un ClientDatabase a través de la User.ClientDatabaseId clave externa. La propiedad Id en User y ClientDatabase son columnas Identity. Mi interfaz UoW se define como sigue:

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

En algún momento, dentro de la misma IUnitOfWork Quiero llamar MarkNew() tanto para una ClientDatabase y un usuario y luego Commit(). 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

5

¿Por qué no utiliza su clase de usuario como Aggregate Root? 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.

Cuestiones relacionadas