Загрузите .edmx в DbModelBuilder - PullRequest
3 голосов
/ 13 июля 2011

Я планирую использовать Entity Framework 4.1 в моем следующем проекте, но у меня возникают проблемы с поиском хорошего способа сделать это. Короче говоря, я хочу создать многоуровневое приложение, в котором объекты будут путешествовать через веб-сервисы, и чтобы все было как можно более чисто, я хочу использовать POCO, а не объекты с самообследованием. Кроме того, уже существует база данных SQL 2008, которая будет использоваться для создания сущностей.

Из того, что я прочитал (из статьи Джулии Лерман о http://msdn.microsoft.com/nl-nl/magazine/hh148150%28en-us%29.aspx, среди прочих), кажется, что:

  • Если вы используете подход Database First, вы получите прекрасный .edmx для редактирования вашей модели, но вы всегда будете получать объекты с поддержкой постоянства, а не POCO, что бесполезно в моей ситуации.
  • Если вы используете подход Code First, «генератор ADO.NET DbContext» помогает вам только частично: он генерирует сущности из .edmx, но не генерирует код, необходимый для получения правильных внешних ключей и мощности , Это означает, что код не будет работать "из коробки" (- edit , не соответствует действительности, см. Мой пост ниже), вы должны либо
    • a) использовать аннотации данных в ваших POCO, что выглядит ужасно, поскольку загрязняет POCO информацией из базы данных, а также создает зависимость от сборки EntityFramework.
    • b) использовать DbModelBuilder, переданный в DbContext.OnModelCreating, чтобы установить правильный внешний ключ, информацию о сопоставлении и т. Д. (Т. Е. «Свободный» API). И хотя API может быть «беглым», все еще довольно сложно (и, вероятно, не поддерживается) правильно настроить всю эту информацию, чтобы она соответствовала существующей базе данных (см. http://sessionfactory.blogspot.com/2011/04/conventions-in-entity-framework-41.html для некоторых примеров этого).

Я понимаю, что причина, по которой "DbModelBuilder-way" требует так много усилий, заключается в том, что он был разработан для использования наоборот: вы должны генерировать базу данных из определений Entity, а не пытаться настроить все Объекты, так что они (надеюсь) соответствуют уже существующей базе данных. Тем не менее, мне кажется, что «DbModelBuilder-way», в конце концов, даст лучший результат: чистые POCO без метаданных базы данных.

Теперь, после всего сказанного, мой вопрос:
Кто-нибудь знает способ загрузки .edmx в DbModelBuilder , чтобы внешний ключ, отображение столбца и другую информацию не нужно было указывать вручную через свободный API?

Я думаю, что это будет лучшим из обоих миров, потому что вы можете визуально редактировать отображение, как в сценарии Database First, и при этом получать чистые POCO, потому что все необходимые метаданные хранятся в DbModelBuilder.

Ответы [ 3 ]

1 голос
/ 13 июля 2011

Человек, о чем ты говоришь?

Если вы используете подход Database First, вы получите прекрасный .edmx для редактирования вашей модели, но вы всегда будете получать объекты с поддержкой постоянства, а не POCO, что бесполезно вмоя ситуация.

Это не правда.EDMX может генерировать практически все, что может сначала написать код, и даже многие вещи, которые вначале не может быть написан.

Если вы используете подход Code First, «генератор ADO.NET DbContext» поможет вам только частично:генерирует сущности из .edmx, но не генерирует код, необходимый для получения правильных внешних ключей и мощности.Это означает, что код не будет работать "из коробки", ...

Это не так.Как только вы правильно настроите EDMX, он создаст именно те объекты, которые вам нужны.

Кто-нибудь знает способ загрузки .edmx в DbModelBuilder

Это DbContextГенератор T4!

В любом случае есть еще один инструмент, который вы можете проверить: EF Power Tools CTP1 .Этот инструмент может создавать сопоставление кода в первую очередь из существующей базы данных.

Конечно, каждый инструмент создает модель, которая сопоставляется с базой данных 1: 1.Если вы хотите что-то еще, вы должны изменить модель или отображение вручную!

1 голос
/ 14 июля 2011

Очевидно, что вы можете использовать сгенерированный код из «Генератора ADO.NET DbContext» двумя способами, в зависимости от типа используемой строки подключения.

Если вы используете сущность строка соединения, т.е.:

<connectionStrings>
  <add name="MyDBEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

, DbContext будет заполнен всеми метаданными (сопоставления столбцов, отношения с внешним ключом и т. Д.) Из .edmx.Кроме того, OnModelCreating DbContext не выполняется.Это база данных сначала с использованием POCO, и это то, чего я хотел достичь.

Что я сделал не так, так это то, что использовал обычную строку соединения SQL для передачи в DbContext.Это вызывает совершенно другой тип поведения: поскольку DbContext теперь пуст, он будет пытаться исследовать все классы сущностей и использовать соглашения для создания схемы базы данных для этого.Теперь вызывается OnModelCreating, ожидая, что вы настроите это отображение, а затем сгенерируете базу данных из этого.

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

0 голосов
/ 13 июля 2011

Читать о шаблонах генерации T4 POCO:

Эти шаблоны генерации кода T4 позволяют использовать

  • подход, основанный на базе данных, с файлом модели EDMX
  • но: генерировать простые POCO (простые старые объекты CLR), у которых нет наследования от какого-либо конкретного класса EF - они просто абсолютно простые классы CLR .....

Это дает вам лучшее из обоих миров - прекрасную модель EDMX и невежественные классы POCO.

...