Які аргументи ПРОТИ за допомогою EntityFramework? [зачинено]


31

Наразі я будую програму використовує Збережені процедури та вручну виготовлені моделі класів для представлення об'єктів бази даних. Деякі люди запропонували використовувати Entity Framework, і я розглядаю можливість перейти до цього, оскільки я не так далеко в проекті. Моя проблема полягає в тому, що я відчуваю, що люди, які сперечаються за ЕФ, говорять мені лише про добру сторону речей, а не про погану сторону :)

Мої основні проблеми:

  • Ми хочемо перевірити клієнтську сторону за допомогою DataAnnotations, і це виглядає так, що я все одно повинен створювати моделі на стороні клієнта, тому я не впевнений, що EF збереже стільки часу на кодування
  • Ми хотіли б, щоб заняття були якомога меншими під час переходу по мережі, і я читав, що використання EF часто включає додаткові дані, які не потрібні
  • У нас є складний рівень бази даних, який перетинає кілька баз даних, і я не впевнений, що EF може впоратися з цим. У нас є одна загальна база даних з такими речами, як "Користувачі", "Коди стану", "Типи" тощо. SELECT запити можуть і будуть запитувати в усіх екземплярах баз даних, однак користувачі можуть змінювати лише об'єкти, які знаходяться в базі даних, над якою вони працюють. Вони можуть перемикати бази даних без перезавантаження програми.
  • Об'єктні режими дуже складні, і в них часто вступає досить багато об'єднань

Аргументами для EF є:

  • Паралельність. Мені не потрібно було б кодувати чеки, щоб побачити, чи запису оновлювались перед кожним збереженням
  • Генерація коду. EF може генерувати для мене моделі часткового класу та POCO, однак я не впевнений, що це дійсно заощадить мені стільки часу, оскільки я думаю, що нам ще потрібно створити моделі на стороні клієнта для перевірки та деякі спеціальні методи аналізу.
  • Швидкість розвитку, оскільки нам не потрібно було б створювати збережені CRUD процедури для кожного об’єкта бази даних

Наша нинішня архітектура складається з сервісу WPF, який обробляє виклики до бази даних через параметризовані збережені процедури, об'єктів POCO, які переходять до / від служби WCF та клієнта WPF, і самого клієнта настільного WPF, який перетворює POCO в моделі класів для перевірки та Обв'язка даних.

Отже, моє запитання: чи правильно для цього EF? Чи є якісь підводні камені щодо EF, про які я не знаю?


Перевірте це також .. порівняння продуктивності та підтримки LINQ: ormeter.net
M.Sameer

Відповіді:


7

Я нещодавно оцінював Entity Framework, і найкращим місцем, яке я знайшов для проблем та відсутніх функцій, було: http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions

Пункти з найбільшою кількістю голосів:

  1. Підтримка переліків. Цей досить великий, але наразі є деякі шляхи вирішення
  2. Поліпшення генерації SQL. Швидкість дійсно важлива, особливо для програм на рівні підприємств, але, схоже, з EF4 вона значно покращилась
  3. Підтримка декількох баз даних. Вимога до будь-якого великого застосування.

У голосовому списку користувачів є ще багато проблем.

Зі сторони, я дуже в захваті від майбутнього випуску EF 4.1, який буде включати підхід «Код-Перший» ... http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4 -1-реліз-кандидат-доступний.aspx

Це насправді може підштовхнути мене спробувати EF у виробничому додатку.


Аргумент проти: 1-го та 2-го та 3-го: Повільно !!! Існує крива навчання (потрібно знати, як зробити приєднання ліворуч - потрібно 3 години, щоб знайти спосіб, як це зробити, щоб інша людина дізналася, що робиться ...), переходить на сторінку в LINQ замість SQL (наприклад, feches 10 мільйонів рядків, потім забирає 20 з довільного зсуву, і тоді вам цікаво, чому це так повільно) ... Repo не безпечний, ви повинні запускати його на основі запиту, і ініціалізація repo - це ДУЖЕ ПОЛІЗКО (наприклад, 5 секунд), якщо у вас є більша база даних (це означає 100-200 таблиць, а НЕ РЕАЛЬНО РЕАЛЬНО великих).
Квандарі

2
@Quandary Здається, що ви виконуєте IQueryables (тобто дзвоніть .ToList()або .ToArray) до того, як ваші вирази LINQ будуть повністю визначені. Ось чому вона витягує всі записи і робить це повільно.
орад

6

Робота гілки за допомогою помилки / функції за допомогою EF може бути надзвичайно болісно під час злиття. Уявіть, що два відділення A і B вносять зміни в базу даних (що, мабуть, відбудеться багато на ранніх етапах нового проекту).

Ви зливаєте всі "звичайні" файли - файли cs і т. Д. І тоді прийшов час об'єднати Model.edmx. І раптом ви не просто з’єднуєте логічні відображення між вашою об'єктною моделлю та базою даних, але й положеннями таблиць на діаграмі об'єкта.

Об’єднання Model.edmx настільки болісне, що ми прийняли досить неприємний спосіб роботи:

  • Під час злиття просто виберіть усі злиття від одного з батьків. Що не має значення; ви швидко тостіть файл:
  • Поверніть Model.edmx до будь-якого з батьків.
  • Перенесіть свою базу даних у новий об'єднаний стан.
  • Відкрийте Model.edmx та "Оновіть модель з бази даних".
  • Перейменуйте всі властивості навігації, обсмажені під час злиття.

1
Ця критика не є дійсною для коду EF Перш за все, але стосується Першої моделі та Першої бази даних.
Алан Макдональд

Я створюю всі відображення самостійно за допомогою Fluent і беру повний контроль над картографуванням. Вони розміщуються всередині окремого файлу .cs.
Стівен Ріссаерт

5

Є кілька інших переваг для EF, які вам не вистачає:

  • Ви можете мати таблиці "Entity"
  • Можна розділити таблицю на багато типів об'єктів
  • Ви можете генерувати Субстанції з бази даних (тобто бази даних як основний підхід)
  • Ви можете генерувати базу даних з Entities (тобто код як основний підхід)
  • LINQ-запити переводяться на SQL-запити, покращуючи їх продуктивність.

Мінуси (особливо якщо ви використовуєте перевірку):

  • Ви повинні створити атрибут [MetadataClass], який вказує на інший клас, який має властивості, які потрібно перевірити за допомогою відповідних атрибутів перевірки. Усі властивості є objectтипами, тому саме там можна прочитати метадані. Ще багато зайвого неактивного коду.
  • Використання EntityFramework - це інша концепція, ніж те, як щось на зразок NHibernate (а також батьківська версія Java) також призначене для роботи. EntityFramework найкраще спрацьовує в приєднаному режимі, де об'єкти використовують пряме з'єднання в реальному часі. NHibernate та подібні інструменти ORM найкраще працюють у відокремленому режимі, коли з'єднання використовується лише під час завантаження / збереження даних.

Це дві найбільші скарги у мене. Є ряд переваг, але ви дуже добре можете отримати ті самі переваги від NHibernate. Якщо EntityFramework стоїть на столі, попросіть команду також перевірити NHibernate та зробити швидку реакцію на плюси та мінуси вашого проекту.

Проблема класу метаданих - головний біль, але, на щастя, у мене є лише стільки сутностей, які потребують тегів перевірки.

Відсутність справжнього окремого режиму для ваших об'єктів обмежує те, що ви можете робити у веб-середовищі. Приєднаний режим кращий для настільних додатків, саме звідси виникла низка нововведень Microsoft. Окремий режим можливий , але дуже болісний. Найкраще в цьому випадку використовувати альтернативний інструмент.


Ваш так званий код як головний підхід офіційно називається кодом
Роберт Коритник

1
@Berin, я хочу уточнити, що ви маєте на увазі під "приєднаним режимом". Я не думаю, що Entity Framework постійно має відкрите підключення до бази даних. Я вважаю, що EF в цьому плані працює аналогічно NHibernate. Це ти маєш на увазі чи ти маєш на увазі щось інше? Чи є у вас посилання на документацію, яка пояснює цю додану проблему далі?
RationalGeek

1
До додається, я маю в виду всі ваші взаємодії з об'єктами повинно відбуватися в межах від using(EFConnection conn = new EFConnection)конструкції. Якщо ви спробуєте сховати цей об’єкт десь для безпечного зберігання, щоб можна було швидко оновити та зберегти його ще раз у другому using(...)операторі, вам доведеться подумати ще раз. Див. Msdn.microsoft.com/en-us/library/bb896271.aspx та msdn.microsoft.com/en-us/library/bb896248.aspx . Використання EF 3.5 (який мені довелося використовувати в останній версії) навіть не так просто.
Berin Loritsch

Гаразд, я розумію, що ти маєш на увазі зараз. Я просто хотів переконатися, що люди не сприйняли це, щоб означати, що до бази даних завжди було з'єднання . У вас повинен бути об'єктний контекст, який підтримує стан "приєднаних" сутностей.
RationalGeek

2
Це не правда. EF має чітке поняття відокремлених утворень. Відділений об'єкт повинен бути приєднаний до його контексту, перш ніж ви зможете виконувати пов'язані з ним операції з контекстом (наприклад, оновлення його в базі даних). Також класи метаданих необхідні, лише якщо EF генерує ваші сутності для вас. POCO, IMO, є набагато кращим способом використання EF. Використання POCO робить багато речей набагато простішими, зокрема тестування.
Метт Грір

2

Одне, що не дуже добре в Microsoft, - це сумісність із зворотною порівняльністю , особливо якщо мова йде про нові технології

Зокрема, EF1 (.net 3.5) сильно відрізняється від EF4 (.net 4.0) - те саме може статися і для наступної версії.

Я зачекав би деякий час і побачив, як дозріває технологія.

Тим часом, подумайте про використання nHibernate - це не еквівалент, але він зрілий і дико використовується.


1
  • Просто ... Модель домену рідко є копією реляційної моделі у вашій базі даних. Тож зіставлення деяких таблиць до класу та перекидання їх через дріт - це просто лінь. Таблиці можуть локально відображатись в одному об’єкті, хоча база даних - 3 різні таблиці. Розробляйте базу даних розумно.
  • По-друге, цей елемент EF не може генерувати певні запити, і вам доведеться їх все одно писати.
  • Третя Доменна модель не відображається безпосередньо на сервісах. Хочеться лише перенести найменший набір даних по дроту як DTO .. ​​особливо, якщо це буде спілкуватися з мобільними додатками.
  • 5Th-здатність до тесту ... Неможливо створити достатньо деталізовані тести, які забезпечать достатню регресію проти змін коду ... все це легко
    зруйнувати ...

Я міг би написати діатриб на 10 сторінок. Але, якщо ви просто пишете якийсь кинутий додаток для компанії X .. кому все одно. Але, якщо ви розробляєте програмний продукт ... вам доведеться бути набагато більш анальним


цю публікацію досить важко читати (стіна тексту). Ви б не хотіли відредагувати його на кращу форму?
гнат

EF не генерує об’єкти домену. Це DAO. Вам потрібно буде використовувати дані об’єкта для створення вашого об’єкта домену. Вам не слід надсилати доменні об’єкти назад із сервісу, тому створіть свій тонший DTO з об’єктів домену перед поверненням. EF повинен бути здатний генерувати більшість всього, що ви можете виразити в LINQ. База даних не є частиною тестової одиниці, вона є частиною функціонального тесту. Однак, у EF є макети пам’яті, доступні. В іншому випадку абстрагуйте ваші EF запити до сховища, а потім замість цього знущайтеся.
Синестетик

Так, я погоджуюся. Скоріше я маю на увазі закономірності, встановлені Мартіном Фаулером та Карігом Лайрманом. Зрештою, я не можу використовувати CTE, PARTITION BY або CROSS APPLY. Я також не можу використовувати IDataReader, який дозволяє зберегти низькі витрати пам'яті. Крім того, коли я запускаю SQL Trace і бачу, що EF надсилає через провід, я відчуваю себе так, ніби можу
кинутись

0

Перевірте це: http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/

Основні моменти:

  • Відсутність ледачого навантаження
  • Відсутність наполегливого незнання
  • Формат файлу, що використовується для збереження моделі сутності, містить як елементи візуалізації, так і сама модель об'єкта викликає проблеми злиття в командному середовищі.

Зауважте, що вищезазначене посилання говорить про EF1.

Також це посилання: http://ormeter.net/ показує, що EF не найкращий порівняно з іншими ОРМ по продуктивності та підтримці LINQ.


Майте на увазі, що це було розміщено, коли EF 1 ще був нещодавно випущений (або можливо, все ще знаходиться в бета-версії). На сьогодні ситуація з EF 4 набагато краща, і багато питань, порушених під час вотуму недовіри, були вирішені.
RationalGeek

Останній пункт все ще рахується і є дуже значущим.
М.Самер

1
Перша версія EF була 3,5. Не було випущено чотирьох основних версій EF.
Метт Грір

3
@Matt це правильно. Але поточна версія називається EF 4 з метою узгодження з рештою версії .NET 4.
RationalGeek

1
Правда чи ні, це не повинно впливати на резюме посилання. Голоси показуватимуть, чи дійсно це. :)
Адам Лір
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.