Я планирую использовать 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.