Modèle d'unité de travail - gestion des relations parent-enfant

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

Question

J'utilise un micro-orm (dapper) et j'essaie d'implémenter une implémentation d'unité de travail (UoW) pour mes référentiels. Je suis un peu perplexe sur la meilleure façon de gérer les relations parent-enfant (clé étrangère) dans mon UoW. Donc, par exemple, si j'ai les deux entités suivantes qui correspondent directement aux tables de base de données:

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

Où un utilisateur a une relation parent-enfant avec une ClientDatabase via la clé étrangère User.ClientDatabaseId. La propriété Id sur User et ClientDatabase sont des colonnes d'identité. Mon interface UoW est définie comme suit:

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

À un moment donné, dans le même IUnitOfWork, je veux appeler MarkNew () à la fois pour un ClientDatabase et un utilisateur, puis sur Commit (). Maintenant, ce que je veux, c'est que la base de données Client soit enregistrée en premier (entité enfant), puis pour l'ID défini sur ClientDatabase, à la suite de l'insertion de la base de données, comme propriété de clé étrangère ClientDatabaseId est ensuite également inséré dans la base de données. Je me demandais simplement si quelqu'un avait résolu ce genre de problème d'une manière générique?

Réponse acceptée

Pourquoi n'utilisez-vous pas simplement votre classe d'utilisateurs comme racine agrégée ? Ainsi, avant de procéder à une insertion dans la base de données, le code vérifie si ClientDatabase n'est pas null. Si ce n'est pas le cas, vous pouvez vérifier la propriété Id pour voir s'il s'agit d'une nouvelle base de données client ou d'une nouvelle base de données (pour décider si vous devez effectuer une insertion ou une mise à jour). Vous pouvez ensuite remplir la propriété ClientDatabaseId.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi