Объем транзакции в EF Repository? - PullRequest
1 голос
/ 19 июня 2011

Я использую шаблон хранилища с EF. В моем проекте мы используем две базы данных, и эти две базы данных находятся в двух разных проектах. В любое время один проект является CoreLib (мы ссылаемся на другой). У меня есть следующие вопросы.

  1. Можно ли использовать один слой хранилища для двух проектов?
  2. Как я могу обеспечить безопасность транзакций, используя System.Transactions.TransactionScope? Примечание. Я использую единую платформу Microsoft и шаблон UnitOfWork.

Спасибо за ваш ответ. Я реализовал функциональность, чтобы сохранить изменения контекста в рамках транзакции. Каждый раз выдается следующее исключение.

{"Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool."}

Я думаю, что это связано с настройкой MSDTC, и я настроил сетевой DTC-доступ на компьютере клиента и сервера SQL. Конфигурация выглядит следующим образом.

Network DTS access  - Enabled.
Allow Remote Clients    - Enabled.
Allow Remote Administration – Enabled.
Allow Inbound   - Enabled.
Allow outbond   - Enabled.
No Authentication Required – Enabled.

Что-то мне не хватает в настройке MSDTC?

Еще один вопрос: связана ли эта конфигурация с конфигурацией домена? Потому что в нашей среде мой сервер БД не разрешен с его именем (мы используем IP-адрес).

Ответы [ 2 ]

1 голос
/ 19 июня 2011

Можно ли использовать один слой репозитория для двух проектов?

Да.

Как я могу обеспечить безопасность транзакций, используя System.Transactions.TransactionScope? Примечание. Я использую единую платформу Microsoft и шаблон UnitOfWork.

Использовать разграничение транзакций на бизнес-уровне, как того требует бизнес (делайте все, что должно быть в одной транзакции в области транзакций).

Поскольку вы используете шаблон UnitOfWork.

  1. Единица работы не имеет ничего общего с транзакцией (в смысле БД). Единица работы определяет время жизни ObjectContext . Вы можете создать TransactionScope по своему усмотрению. Неважно, если вы создадите его после или до создания единицы работы.
  2. Можно проводить разграничение транзакций с атрибутами в бизнес-методах, поскольку UnityFW является контейнером ioc.

Некоторые сведения о транзакциях и EF:

  1. Транзакции работают с DbConnections и не имеют ничего общего с EF.
  2. Вы можете смешивать старые компоненты SQL с компонентами EF и даже более одной базы данных в одной транзакции, если все задействованные драйверы поддерживают двухфазное принятие.
  3. SaveChanges из ObjectContext будет участвовать в глобальной транзакции. Если глобальная транзакция отсутствует, она создаст новую транзакцию, сохранит все данные и зафиксирует или откатит.
0 голосов
/ 19 июня 2011

вы можете сделать что-то вроде этого.Предположим, что два контекста вашей базы данных названы FirstContext and SecondContext`

public class ContextFacade : IUnitOfWork // your Unit of work interface
{
  FirstContext _fc;
  SecondContext _sc
  public ContextFacade(FirstContext fc, SecondContext sc)
  {
     _fc = fc;
     _sc = sc;
  }

  public void SaveChanges()
  {
    var scope = new TransactionScope(TransactionScopeOption.Required, options);
    using(scope)
    {
      _fc.SaveChanges();
      _sc.SaveChanges()

      scope.Complete();
    }
  }
}

Взгляните на ответ Ладислава Мрнки о том, как все это можно соединить.

...