Паттерн Unit of Work - управление родительскими и дочерними отношениями - PullRequest
8 голосов
/ 10 июня 2011

Я использую микро-форму (dapper) и пытаюсь придумать реализацию единицы работы (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; }
}

Если пользователь имеет отношения родитель-потомок с ClientDatabase через внешний ключ 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 и User, а затем Commit (). Теперь я хочу, чтобы сначала была сохранена база данных ClientDatabase (дочерняя сущность), а затем для идентификатора, который был установлен в ClientDatabase, в результате его вставки в базу данных, было задано свойство внешнего ключа ClientDatabaseId для пользователя перед ним. затем также вставляется в базу данных. Мне просто интересно, решил ли кто-нибудь такую ​​проблему хорошим общим способом?

1 Ответ

5 голосов
/ 28 июля 2011

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

...