Ну, я только что закончил внедрение полной системы в EF, это был мой первый реальный опыт работы с EF в производственной среде. Приложение работает уже около 45 дней, и сотни пользователей ежедневно обращаются к нему без проблем.
Я думаю, самое важное, что вы должны изменить свое мышление. Если вы думаете, как реляционная база данных ORM, то у вас уже неправильное мышление. Вы должны думать с точки зрения частичных методов, объектов и расширений. После того, как вы выработаете это базовое мышление, все начинает течь (и вы переписываете много кода с самого первого запуска).
Получение справки является грубым
Другая неприятная часть EF - то, что везде, куда вы обращаетесь за помощью, полно фанатов L2S, которые думают, что они уже знают все, что вам нужно сделать, и продолжают пытаться сказать вам, чтобы бросить это и просто использовать L2S ... Если бы я спросили, как это сделать в L2S, тогда, возможно, их мнение будет обоснованным ...
EF отлично работает
Базовая способность генерировать объекты, которые вы затем можете расширить с помощью частичных методов, работает хорошо. На самом деле я был довольно разочарован на ранних стадиях, потому что я продолжал пытаться получить вещи, как я это делал в SQLCommand. Как только вы поймете, что вы можете думать с точки зрения потребностей бизнес-логики, а не того, как работает SQL, вы можете сделать гораздо больше.
Например - я продолжал пытаться делать объединения, чтобы получить список вещей, которые были связаны определенным FK для различных задач. Однажды я наконец понял, что могу передать EF все условия where и дать понять, как быстро вернуть мне данные, код на самом деле был намного быстрее.
Включает вонючий
Синтаксис включения для меня все же выглядит как хак. Необходимость использования .Include ("TableName.DetailTable") ужасна. Может быть, я просто избалован intellisense, но я ненавижу этот синтаксис.
По требованию нагрузки
Загрузка основных деталей также немного некрасива. Если вы не хотите включать их, вы всегда можете взять их ссылку и посмотреть, является ли она .IsLoaded, а затем вызвать .Load. Зачем? Разве объект не может сделать это для меня? В итоге я реализовал метод расширения на своих объектах, который, если я пытаюсь загрузить не детализированный класс детализации, загружает его по требованию. Похоже, это должно было быть встроено в меня.
Примечание. Подробная загрузка отфильтрованного набора записей, упомянутого в посте выше, не сложна, но и не очевидна. Вы можете фильтровать, используя лямбда-выражения.
Вы когда-нибудь хотите перенести проект?
Вот основная причина: блокировка не от поставщика. Если вы НИКОГДА не захотите перенести этот код в другую базу данных, вы НЕ МОЖЕТЕ сделать это с Linq2SQL. Там нет модели провайдера. У вас может быть возможность переместить систему EF другому поставщику. В моем случае один и тот же проект работает на SQL Server и VistaDB EF (Alpha) без изменений кода. Поэтому я могу развернуть его xcopy или подключиться к серверу по своему усмотрению во время выполнения.