Entity Framework 4.1 Проблемы генератора DbContext - PullRequest
2 голосов
/ 28 сентября 2011

Я новичок в Entity Framework 4.1 и очень хотел перейти на классы POCO для моей модели.Я обнаружил, что это было очень легко, используя пункт «Генератор DbContext», предоставленный при установке EF 4.1.Он сделал именно то, что я хотел, и сгенерировал объект DbContext и все POCO для моей существующей модели EDMX.

Я запустил приложение и проверил, что оно все еще работает.Это было.Довольный этим, я удалил файл EDMX и шаблоны T4 и начал реорганизацию моих новых POCO.Однако после правильной сборки он столкнулся с проблемой во время выполнения.При создании экземпляра DbContext он не может найти файлы метаданных: .csdl, .ssdl и & .msl (я действительно не знаю, что это такое, просто они являются частью всех строк подключения EF).

После установки моего EDMX снова все заработало.Я действительно не хочу файл EDMX больше.Я действительно хотел бы придерживаться классов POCO и забыть, что EDMX когда-либо существовал;особенно потому, что я не хочу, чтобы он запускал эти шаблоны T4 и восстанавливал мои POCO.

У меня есть четыре связанных вопроса:

  1. Почему я должен сохранить edmx в моем проекте?
  2. Есть ли обходной путь для этого?
  3. Что происходит, когда вы действительно выполняете «сначала код» с EF 4.1, откуда он получает эти файлы метаданных?
  4. Чтов любом случае это файлы метаданных?

Ответы [ 3 ]

3 голосов
/ 28 сентября 2011

Вы должны прочитать это .Он описывает различные типы проектов.

Краткий ответ: вам нужен файл .edmx при использовании генератора dbcontext.Если вы хотите использовать Code First, вы должны либо описать модель вручную, либо использовать мощные инструменты Entity Framework CTP1 для обратного инжиниринга модели кода сначала.

2 голосов
/ 28 сентября 2011
  1. Файл EDMX отвечает за встраивание ресурсов метаданных CSDL, SSDL и MSL в сборку во время компиляции.

  2. Да.Вам понадобится CTP Entity Framework Power Tools 1. Для получения ссылки см. Ответ Mystere Man на этот вопрос.Это будет истинное преобразование из существующей базы данных в код в первую очередь.Это означает, что ваш код будет продвигать схему вперед, а не наоборот.

  3. Когда вы делаете настоящую разработку кода, ресурсы метаданных CSDL, SSDL и MSLвсе еще там.Они просто выводятся из вашей объектной модели при сборке.Поскольку код управляет моделью и схемой, он может самостоятельно определять эти ресурсы.Однако есть некоторые случаи, когда он не знает, что выводить из кода.Например, если вы измените имя свойства сущности, он не сможет узнать, намеревались ли вы удалить старый столбец (имя свойства) и добавить новый столбец с новым именем, или вы намеревались сохранить старый столбец и переименовать его.с новым именем.Вот почему нет хорошей миграции данных / схем с EF-кодом в первую очередь, и поэтому он отбрасывает и воссоздает всю базу данных каждый раз, когда вы изменяете свою модель в коде.

    Этот недостаток DbContext API, безусловно, самый большойпроблема и в настоящее время работает над командой ADO.NET, как отмечено в блоге Скотта Хэнслемана .

    На данный момент я лично решил изменить базу данных вручную, а затем просто обновить свой C #код, чтобы отразить это.Это требует некоторого приличного знания того, как эти вещи работают, и я все еще практикуюсь.Другой способ сделать это - оставить файл EDMX там, обновить его, как обычно, и позволить ему восстанавливать ваши POCO, когда что-то изменится.Однако это почти ничем не отличается от выполнения классических обновлений EF, поскольку любые изменения в POCO будут перезаписаны при их регенерации.

    Еще одно решение состоит в том, чтобы снова оставить файл EDMX и обновить его, когда все изменится, ноустановите для свойства «Преобразовать связанные текстовые шаблоны при сохранении» значение false.

    http://www.codetunnel.com/content/images/TransformRelatedTextTemplatesOnSave.jpg

    Это не позволяет EDMX запускать ваши шаблоны T4 и повторно генерировать ваши POCO.Таким образом, вы просто обновите его, чтобы убедиться, что ресурсы метаданных остаются точными.Но тогда вы бы вручную изменили свои POCO, чтобы отразить любые изменения в модели / схеме.Это все еще требует гораздо больше работы, чем просто создание кода, но, на мой взгляд, это полезно для изучения.

  4. CSDL, SSDL и MSL являются ресурсами метаданных для EF.Они помогают EF определить, как сопоставить наборы результатов с вашей объектной моделью и наоборот.Это мост между схемой базы данных и вашим кодом.Независимо от того, как вы используете EF, эти ресурсы существуют, но отличаются только тем, как они генерируются.

0 голосов
/ 28 сентября 2011

Это не сработает. Если вы решите использовать DbContext Generator, вы говорите, что ваше отображение будет описано в файле EDMX. Во время компиляции файл EDMX раскладывается на три отдельных файла с расширениями .ssdl, .csdl и .msl. Эти файлы метаданных описывают вашу базу данных, сущности и отображение из базы данных в сущности. Эти файлы по умолчанию хранятся как ресурсы в вашей скомпилированной сборке и на них ссылаются из строки подключения, передаваемой вашему экземпляру DbContext. Вы должны сохранить файл EDMX в проекте, если хотите использовать DbContext, созданный генератором. Это тот же подход отображения, который использовался в EFv1 и EFv4 = это не код вначале.

Код вначале означает отсутствие EDMX и шаблона T4 для генерации сопоставления и кода для вас. Обычно код сначала означает, что вы пишете свои классы до того, как у вас есть какая-либо база данных, а EF создает базу данных. Многие люди используют этот подход с существующей базой данных и сопоставляют свои классы с существующей базой данных вручную, но это требует определенных знаний / опыта работы с EF (или вы можете задать целевые вопросы здесь, и мы поможем вам).

Метаданные необходимы для контекста для выполнения сопоставления и генерации команд SQL. Стратегия отображения EDMX использует метаданные, определенные в упомянутых файлах XML. Стратегия отображения первого кода использует некоторые соглашения по умолчанию, fluent-API или аннотации данных для получения метаданных из скомпилированного кода.

Существует отдельный проект, позволяющий сгенерировать сначала сопоставление кода из существующей базы данных - я указал этот проект в вашем предыдущем вопросе .

...