EF4.0, репозитории и Ninject 2 - PullRequest
1 голос
/ 03 июня 2011

Это продолжение двух текущих проблем, с которыми я сталкиваюсь: Проблемы с попыткой присоединить новый объект EF4 к ObjectContext, в то время как его объекты коллекции объектов уже подключены и EF4.0 - Есть ли способ узнать, какие сущности прикреплены к какому ObjectContext во время отладки? Я использую это пространство, чтобы задать еще один довольно сложный вопрос, и я не хочу делать огромный, очень длинный вопрос из моих других потоков.

Итак, краткое изложение:

У меня есть входящие данные формы, которые связаны с DTO. Я хочу отобразить DTO на Entity (игровую сущность). Проблема заключается в том, что Игра содержит коллекцию EntityCollection, которую я должен создать и добавить () в Игру на основе int [] в DTO (каждое целое число представляет идентификатор платформы). И, естественно, EF4 задыхается отчасти потому, что это отношение многие-ко-многим, но, я думаю, потому что происходят некоторые махинации с тем, сколько объектов ObjectContext находятся в игре. Я продолжаю получать исключение, утверждая, что не могу добавить мои извлеченные сущности Платформы в мою новую сущность Игры, потому что они принадлежат двум разным объектным объектам. Я не могу понять, как это возможно, учитывая мои текущие настройки, но я не уверен, в чем еще проблема может быть.

Хорошо, у меня есть три репозитория, которые я внедряю в свой контроллер через инъекцию интерфейса Ninject. Я создаю ObjectContexts в каждом так:

public class HGGameRepository : IGameRepository
{
    private HGEntities _siteDB = new HGEntities();

    // rest of repo
}

Два других хранилища построены одинаково.

Мой код Ninject DI довольно прост:

private class HandiGamerServices : NinjectModule
{
    public override void Load()
    {
        Bind<IArticleRepository>().To<HGArticleRepository>().InRequestScope();
        Bind<IGameRepository>().To<HGGameRepository>().InRequestScope();
        Bind<INewsRepository>().To<HGNewsRepository>().InRequestScope();
        Bind<ErrorController>().ToSelf().InRequestScope();
    }
}

Из того, что я прочитал, эти привязки должны создаваться один раз для каждого HTTP-запроса.

Я бы хотел, чтобы один экземпляр моего объекта HGEntities был общим для всех репозиториев, чтобы гарантировать, что у меня в игре один и только один ObjectContext. Я просто не уверен, как это сделать.

Есть ли стандартный способ сделать это?

1 Ответ

2 голосов
/ 07 июня 2011

Вот один из вариантов:

Измените ваши репозитории так, чтобы они использовали интерфейс IHGEntities в своем конструкторе и подключили HGEntities к вашему NinjectModule так же, как вы делали с вашими репозиториями.Таким образом, когда вашим контроллерам необходим экземпляр IArticleRepository, Ninject либо создаст экземпляр экземпляра HGEntities для передачи в репозитории, либо использует экземпляр, который уже активен в текущем контексте HTTP.

Затем внутри ваших классов репозитория вы можете просто привести IHGEntities к HGEntities.

...