Entity Framework - контекст области в веб-приложении - PullRequest
1 голос
/ 04 февраля 2010

Я реализовал простой шаблон хранилища для Entity Framework в веб-приложении.

У меня есть несколько репозиториев, которые все подклассируют базу, которая имеет некоторые общие методы в

База выглядела так

public class BaseRepository<TEntity> : IRepository<TEntity>
{
    protected readonly RedirectsEntities Context;

    public BaseRepository()
    {
        Context = new RedirectsEntities();
    }

(RedirectsEntities - это текстовый текст EF, или как он там называется)

И у меня был RuleRepository и SiteRepository, который его подклассил

Однако это вызвало у меня проблемы при поиске сайта и использовании этого значения для сохранения в правиле

ошибка была

"ADO.Net Entity Framework На объектный объект нельзя ссылаться несколькими экземплярами IEntityChangeTracker"

Предположительно, потому что каждый репозиторий имеет свой экземпляр RedirectsEntities?

Итак, я нашел этот вопрос: ADO.Net Entity Framework На объектный объект нельзя ссылаться несколькими экземплярами IEntityChangeTracker

, который предлагает переместить текст данных в отдельный класс, держа его в статической переменной

, например

public class DataContext
{
    private static RedirectsEntities _dbEntities;
    public static RedirectsEntities DbEntities
    {
        get
        {
            if (_dbEntities == null)
            {
                _dbEntities = new RedirectsEntities();
            }
            return _dbEntities;
        }
        set { _dbEntities = value; }
    }
}

и тогда мой базовый конструктор хранилища будет выглядеть так:

public BaseRepository()
{
     Context = DataContext.DbEntities;
}

Так что, похоже, это решило мою проблему, но я обеспокоен тем, что область действия RedirectsEntities теперь неверна.

Может кто-нибудь прокомментировать это?

1 Ответ

2 голосов
/ 04 февраля 2010

В веб-приложениях наиболее распространенным решением является определение контекста для каждого http-запроса. Вы инициализируете контекст в начале запроса и располагаете его в конце. Во время запроса вы можете сохранить контекст в состоянии сеанса.

Если вы используете контейнер Inversion of Control (IoC), вы можете заставить свой контейнер позаботиться о сохранении контекста во время запроса и предоставить его в свои репозитории.

Обновление

Если вы не используете IoC, я бы создал текст данных в начале запроса и перевел его в состояние сеанса. Затем я бы изменил конструктор вашего базового репозитория, чтобы взять в качестве параметра экземпляр вашего datacontext. Затем каждый раз, когда вы создаете репозиторий, вы получаете контекст из сеанса и предоставляете его в свой репозиторий. И в конце запроса вы получаете контекст из сеанса и распоряжаетесь им. Таким образом, все ваши репозитории будут использовать один и тот же контекст в течение одного запроса.

...