Первая модель Entity Framework 5. Куда пропал IDisposable?

Во-первых, в модели Entity Framework 5, похоже, есть некоторые критические изменения из-за того, как генерируются файлы классов (больше не генерация кода, а шаблоны T4)

2 примера:

  • Сгенерированный файл контекста больше не реализует IDisposable
  • Больше нет конструктора, который принимает строку подключения

Есть ли еще критические изменения? И какое решение для них?


person Tom Deleu    schedule 20.09.2012    source источник


Ответы (3)


Код по умолчанию, сгенерированный из модели в Entity Framework 5, теперь наследует DbContext вместо ObjectContext.

Это по-прежнему реализует IDisposable, но если вы получаете сообщение об ошибке из строки кода, подобной этой:

using (var mymodel = new MyModelContext()) { ... }

... жалуетесь на то, что не реализуете IDisposable, то ваша проблема, скорее всего, заключается в том, что ваша модель определена в отдельной сборке, которая ссылается на EF5, и вы не добавили ссылку на EF5 в свой проект.

Как Ладислав Мрнка уже упоминал в своем ответе, если вы хотите передать строку подключения конструктору, вам нужно вручную создать собственный конструктор для этого.

Если вы хотите переключить Entity Framework обратно на старый стиль сгенерированного кода, который автоматически сгенерирует нужный вам конструктор, выполните следующие действия.

  1. Нажмите на поверхность конструктора вашего файла EDMX и посмотрите на окно свойств. Найдите свойство под названием «Стратегия генерации кода» и установите для него значение «По умолчанию» вместо «Нет». Это укажет Visual Studio начать создание кода для вашей объектной модели в MyModel.Designer.cs в одном большом файле, на этот раз используя ObjectContext вместо DbContext.
  2. Удалите следующие подфайлы из-под файла EDMX: MyModel.Context.tt, MyModel.tt. Это автоматически сгенерированные файлы, которые вам больше не нужны. Если вы не удалите их, вы получите конфликты имен классов, потому что ваши объекты будут созданы дважды.
person BG100    schedule 24.09.2012
comment
Спасибо! На случай, если другие пропустили это, проект, реализующий код использования (...), нуждается в новой EntityFramework.dll, а не только в проекте, содержащем файл .edmx. - person Parmenides; 08.07.2013
comment
@Parmenides, не могли бы вы указать, какая ссылка на использование ему нужна? - person Zapnologica; 08.05.2014
comment
Спасибо! Помимо ссылки на EntityFramework мне также нужно было добавить ссылку на System.Data.Entity, после чего моя ошибка использования исчезла. :) - person Mark Whitaker; 15.05.2014

Сгенерированный файл контекста больше не реализует IDisposable

IDisposable по-прежнему реализуется родительским типом контекста. Сгенерированный тип по-прежнему одноразовый.

Больше нет конструктора, который принимает строку подключения

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

Есть ли еще критические изменения? И какое решение для них?

Это кардинальное изменение, потому что он использует другой API - API DbContext вместо API ObjectContext, что означает разные типы, разные методы, объекты POCO и т. д. Если вы хотите вернуться к исходной генерации кода, вам необходимо удалить эти шаблоны T4 и включить генерацию кода. как описано в файле .Designer.cs, но в настоящее время рекомендуется использовать POCO и DbContext API.

person Ladislav Mrnka    schedule 20.09.2012

У меня была та же проблема с оператором использования, которому требовался тип, расширяющий IDisposable... Оказывается, я забыл сослаться на System.Data.Entity в своем проекте... Добавил ссылку, и это устранило проблему.

person Zach Painter    schedule 07.04.2015