Шаблон единицы измерения работы - управление отношениями родитель - потомок

StackOverflow https://stackoverflow.com/questions/6305184

Вопрос

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top