Шаблон «Единица работы» - управление родительскими дочерними отношениями

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

Вопрос

Я использую микро-orm (dapper) и пытаюсь придумать реализацию Unit of Work (UoW) для своих репозиториев. Я немного озадачен тем, как лучше иметь дело с отношениями родитель-ребенок (внешний ключ) в моем UoW. Например, если у меня есть следующие два объекта, которые отображаются непосредственно в таблицы базы данных:

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

Если у пользователя есть отношения родитель-потомок с клиентской базой данных через внешний ключ User.ClientDatabaseId. Свойством Id как для User, так и для ClientDatabase являются столбцы Identity. Мой интерфейс UoW определяется следующим образом:

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

В какой-то момент в том же IUnitOfWork я хочу вызвать MarkNew () как для ClientDatabase, так и для пользователя, а затем для Commit (). Теперь я хочу, чтобы сначала была сохранена ClientDatabase (дочерний объект), а затем для идентификатора, который был установлен в ClientDatabase, в результате его вставки базы данных, который должен быть установлен как свойство внешнего ключа ClientDatabaseId для пользователя до его затем также вставляется в базу данных. Я просто задавался вопросом, разрешил ли кто-нибудь такой вопрос в общем родовом стиле?

Принятый ответ

Почему бы вам просто не использовать свой пользовательский класс в качестве сводного корня . Поэтому перед тем, как вы вставьте в базу данных код, проверьте, не является ли ClientDatabase значением null. Если не null, вы можете проверить свойство Id, чтобы узнать, есть ли его новая клиентская база или существующая (чтобы решить, нужно ли вам вставлять или обновлять). Затем вы можете заполнить свойство ClientDatabaseId.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow