Чи варто використовувати Entity Framework?


31

На даний момент у нас є такий стек:

  • VS 2005
  • Веб-форми
  • SQL Server 2005
  • IIS 6

Ми плануємо перейти до цього:

  • VS 2010
  • MVC та веб-форми
  • SQL Server 2008
  • IIS 7

Моє питання: коли ми переходимо до MVC з VS 2010, чи слід використовувати Entity Framework (або інший ORM), мікро ORM (як Massive ) або просто звичайний SQL?

Усі навчальні посібники, які я читав про VS 2010, орієнтовані на використання Entity Framework для транзакцій з даними, але чи це буде в найближчому майбутньому (5+ років)?

Якщо це важливо, програми наших клієнтів можуть мати від 10 до 1000 активних користувачів.


Ви зараз використовуєте Linq-to-SQL?
Морган Херлокер

Ми використовуємо параметризований SQL
guanome

4
Уникайте використання SQL безпосередньо у своїй майбутній розробці. ORM або EF майже не обов'язкові. Приділіть колись стратегію для свого рівня доступу до даних. Це критичне рішення, і це не тривіальне завдання. Переконайтесь, що у вас є достатньо часу для вас та команди, щоб навчитися цьому. Впровадження в команду нових основних технологій має бути керованим. Виберіть інструмент, виберіть матеріал, отримайте певну освіту, ..., а потім оцініть та вирішіть.
NoChance

2
Нові чи існуючі бази даних? Потенційно існує величезна різниця між створенням нової БД з урахуванням умовних положень EF та спробою доопрацювати EF поверх існуючої БД, яка не була побудована для ORM.
rmac

@rmac Це було для нової бази даних.
guanome

Відповіді:


45

Нещодавно я перейшов від використання вбудованих SQL запитів до використання EF, і ось що я знайшов:

Плюси

  • Набагато швидше створити DAL (люблю не писати SQL-запити!)
  • Набагато простіше в обслуговуванні
  • Більше не потрібно пам’ятати, щоб проаналізувати мою інформацію перед тим, як скласти In-line-оператор sql, що означає менший шанс нападу ін'єкції SQL (звичайно, це все ще можливо в залежності від ваших запитів, але набагато рідше)

Мінуси

  • Не можна охопити кілька баз даних ... принаймні, не просто
  • Усі сутності (таблиці, представлення даних тощо) потребують первинного ключа
  • Якщо ви хочете оновити один стовпець у 100+ необхідних таблицях стовпців (не мій дизайн таблиці), для оновлення вам доведеться знищити всі 100 стовпців. Або використовувати Збережену процедуру.
  • У мене виникли проблеми з деякими значеннями за замовчуванням, визначеними на сервері SQL, і не потрапляє в модель сутності після того, як додається нова запис. Зазвичай це з обчисленими значеннями або значеннями, що додаються в триггер INSERT
  • Іноді запити SQL погано пишуться і виконуються повільно. Якщо у вас є повільний запит, запустіть SQL-слід, щоб побачити, що робить EF. Можливо, ви можете переробити цей запит як SP або View. Але це трапляється не так часто.
  • У мене виникло декілька проблем із спробою створити асоціацію між таблицями, у яких немає зовнішнього ключа, визначеного в SQL Server. Зазвичай це тому, що я намагаюся створити 1:0-1відносини, коли EF хоче використовувати1:0-*

Я, однак, не фахівець з EF, тому, певно, я пропустив щось. Це лише ті пункти, з якими я знаю, з якими я стикався в минулому при переході від вбудованого SQL до Entity Framework. Я радий, що перемкнувся, але були випадки, коли я дуже ненавидів EF через його химерність.


7
+1 для детальної та організованої відповіді. "Усі сутності (таблиці, представлення даних тощо) потребують первинного ключа" звучить як розумне обмеження, а не обмеження.
NoChance

2
@EmmadKareem Це нормальне обмеження, якщо у вас є контроль над базою даних, але якщо ви працюєте з базою даних сторонніх організацій або з переглядами, це може бути трохи дратує
Рейчел

1
Просто спробуйте використовувати EF у відключеному веб-додатку N-Tier - оновлення об'єктів у сеансі та взаємовідносинах з ММ, хммммм, що цікаво!
Відар

5
Суб'єктам @EmmadKareem дійсно потрібен єдиний цінний первинний ключ - використання складених ключів кошмар у EF. Це швидше, ніж розумне обмеження.
Кірк Бродхерст

1
Я б сказав, що безпека - це інше питання. Багато хто думає, що весь доступ до БД повинен проходити через збережені процедури з ролями БД, пов'язані з документами, щоб визначити, які входи можуть виконувати, які збережені документи. Це виключає EF / LINQ для створення запитів. Я використовував EF, але натрапив на клієнтів ( кашель Microsoft), які мали такі вимоги безпеки
Мік

12

Entity Framework - це інструмент підвищення продуктивності праці. Якщо у вас немає вагомих причин цього не робити (EG ви перебуваєте на SQL 2000 або не маєте часу нарощувати технологію), тоді використовуйте найкращі інструменти, які у вас є.

Попри це, я вважаю, що поняття Entities дуже добре перекладаються на модель моделі MVC. Хоча стосунки з моделями та таблицями у відносинах 1: 1 є поганою практикою, мислення з точки зору організацій має тенденцію створювати чисті конструкції, легко читати код (особливо з LINQ).

Microsoft Entity Framework активно підтримується Microsoft. Ніхто не має магічного кришталевого кульки, щоб сказати, що "підтримка триватиме X років". Я не бачу причин вважати, що суб'єкт господарювання помре в найближчі 5 років.


3
LinqToSql помер досить швидко, тому насправді немає підстав вірити так чи інакше, чи виживе Entity Framework. Варто врахувати новий поштовх МС до метро, ​​настільки, наскільки вони можуть розглянути можливість капітального ремонту багатьох своїх пропозицій.
ocodo

3
Сломоджо, можливо, ви маєте інше визначення слова «мертвий» від решти світу. Тому що LinqToSql просто більше не активно розвивається. Ви все одно зможете користуватися ним через 10-20 років.
Борис Янков

4

Іншим потенційним рішенням є використання альтернативної бібліотеки Entity Framework, яка не є тією, що постачається з VS У мережі є декілька.

Концепція фреймворку Entity / 3 шарів існувала вже деякий час і працювала з декількома спеціалізованими бібліотеками, як і багато інших розробників, перш ніж Microsoft випустила власну "офіційну" структуру.

Плюси

Майте переваги структури Entity (DAL), не заважаючи постійним змінам бібліотек / змін у Microsoft.

Додавання функцій до бібліотеки, які, можливо, недоступні для існуючої офіційної бібліотеки, як-от використання декількох марок dtabase.

Мінуси

Доводиться підтримувати бібліотеку чи інструменти. Дуже звичайно мати інструмент генератора коду Entity для генерації enitites.


Я вважаю цю відповідь дуже заплутаною. Є лише одна Entity Framework (з великими літерами), яка є тією, яку виробляє Microsoft. Ви маєте на увазі "використовувати інший об'єктивний реляційний маппер"? Entity Framework не є загальним терміном - це ім'я ORM Microsoft.
NickG

Начебто існує "Microsoft Entity Framework", концепція "Entity Framework" існує вже кілька років.
umlcat

3

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

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


3
+1 за рекомендацію не переписувати робочий код.
NoChance

2

У вашій ситуації я б точно використав Entity Framework, я виявив, що він добре працює з MVC.
Ось кілька справжніх причин та покажчиків.

  • Linq - це приємно користуватися, а також затримка виконання також надзвичайно корисна.
  • Ви можете генерувати свої моделі (однак, коли ви використовуєте mvc, я б рекомендував використовувати моделі перегляду спільно з моделями даних, це полегшує перевірку та прив'язку моделі, якщо ви скористаєтеся таким підходом, використовуючи автоматичний автоматичний перемикач змін на ваш модель даних).

Однак ви можете дізнатися про ряд речей про використання ORM.

  • Що контекст робить для вас (відстеження сутності)
  • Що контекст слід використовувати як одиницю роботи
  • Пам'ятайте, що стосується паралельності, EF може сказати вам, коли ваш об’єкт застарів, але це може бути складним, якщо ви хочете правильно обробляти паралельність за запитами (як вам потрібно дотримуватися часову позначку чи щось).

Що слід врахувати

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

Я також дуже рекомендую перший підхід до коду, навіть якщо у вас є існуюча база даних.

  • Конвенції означають, що вам не потрібно реєструвати відображення чи класи під час зміни бази даних.
  • Це зручніше розміщувати валідацію та іншу логіку в моделях.
  • Ви можете використовувати генератор коду, щоб зробити їх, якщо у вас є величезна база даних.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.