Правильный способ зарегистрировать EF4 ObjectContext с использованием Unity? - PullRequest
4 голосов
/ 13 февраля 2011

У меня проблемы с моим EF4 ObjectContext в Unity. В частности, когда Unity пытается разрешить мой ObjectContext с помощью следующего кода:

container.RegisterType<ObjectContext, MyObjectContext>(
    new TransientLifetimeManager(), new InjectionConstructor());

Это дает мне:

Указанное именованное соединение либо не найдено в конфигурации, не предназначено для использования с поставщиком EntityClient, либо недействительно.

Я предполагал, что он сможет использовать проводное соединение, которое было установлено при создании модели данных EF4 (используется с конструктором без параметров), но, похоже, я должен явно передать это в:

container.RegisterType<ObjectContext, MyObjectContext>(
    new TransientLifetimeManager(), new InjectionConstructor(connectionString));

Кроме того, поскольку этот метод, по-видимому, создает экземпляр моего (одноразового) ObjectContext, когда это подходящее место для его уничтожения?

Или мне вообще следует поступить иначе?

Заранее спасибо.

1 Ответ

2 голосов
/ 13 февраля 2011

Исключение «Указанное именованное соединение либо не найдено в конфигурации, не предназначено для использования с поставщиком EntityClient, либо недопустимо».очевидно, не является результатом неудачного разрешения зарегистрированного типа, но это исключение EF.

Дизайнер EF должен был создать контекст с конструктором, подобным этому:

public MyObjectContext() : base("name=MyObjectContext", "MyObjectContext")
{
    ...
}

и добавилСтрока подключения к app.config / web.config.Предполагая, что дизайнер не сделал этого неправильно, я бы исключил, что это «именованное соединение» «не предназначено для использования с поставщиком EntityClient или недопустимо».Остается, что «именованное соединение» «не найдено в конфигурации».

Вы проверили, находится ли строка соединения в app.config / web.config проекта, в котором вы решаетеObjectContext ?Например, если у вас есть модель EF в отдельной библиотеке классов, то EF создает app.config с соответствующей строкой соединения в этом проекте.Если вы используете эту модель из другого проекта, который ссылается на вашу библиотеку классов EF, вам нужно вручную скопировать строку подключения в app.config / web.config этого проекта.EF не будет изучать конфигурацию вашей библиотеки классов.

Относительно вашего вопроса, как правильно уничтожить ObjectContext, самый общий ответ будет: «Когда он вам больше не нужен».Трудно дать совет, не зная контекст вашего проекта.Если вам нужен доступ к данным одним способом, я думаю, вы могли бы написать:

using (var context = container.Resolve<ObjectContext>())
{
    // your EF operations
}
...