Является ли ADO.NET Entity Framework (с ASP.NET MVC v2) жизнеспособным вариантом при написании пользовательских и постоянно обновляемых веб-сайтов? - PullRequest
6 голосов
/ 24 июня 2010

Я только что закончил изучение учебника MvcMusicStore , найденного здесь . Это отличный учебник с рабочим исходным кодом. Пока один из моих любимых уроков по MVC v2.

Этот учебник является моим первым введением в использование ADO.NET Entity Framework, и я должен признать, что большая его часть была действительно быстрой и понятной. Тем не менее, я беспокоюсь за ремонтопригодность. Насколько настраиваема эта структура, когда клиент запрашивает дополнительные функции на своем сайте, которые требуют новых полей, таблиц и связей?

Я очень обеспокоен тем, что не могу эффективно выполнять заказы клиентов на изменения, потому что модели Entity в основном представляют собой перетаскиваемый код, созданный компьютером. Мой опыт работы с генераторами кода не очень хорош. Что, если что-то сходит с ума в кишках модели, и я не могу собрать Шалтай-Болтай вместе?

В конечном счете, я задаюсь вопросом, является ли использование моделей, написанных от руки, которые люди могут читать и редактировать, более эффективным курсом, чем использование Entity Framework.

Кто-нибудь достаточно поработал со структурой сущностей, чтобы сказать, что ему удобно использовать ее в очень изменчивой среде разработки?

Ответы [ 4 ]

7 голосов
/ 24 июня 2010

Я использую Entity Framework (V1.0) около года в моем текущем проекте.У нас есть сотни таблиц, все они добавлены в edmx.Проблемы, с которыми мы сталкиваемся (хотя и не уверены, что новая структура сущностей устраняет эти проблемы)

  1. Когда вы привыкли к IDE VS.net, вы привыкнете выполнять все операции перетаскивания изВы едете.Проблема в том, что, как только ваш edmx содержит 100 таблиц, среда IDE действительно останавливается, и вам придется ждать 3-4 минуты, прежде чем она станет отзывчивой

  2. При таком количестве таблиц любые измененияВы делаете на edmx много времени.

  3. Когда вы собираетесь использовать контроль версий, сравнение 10000 строчных XML довольно болезненно.Подумайте о слиянии двух ветвей, каждая из которых имеет edmx по 10000 строк, таблиц, новой ассоциации между таблицами, удаленных ассоциаций и переходе вперед и назад при сравнении xmls.Вам понадобится хороший инструмент сравнения xml, если вы серьезно настроены объединить 2 больших файла edmx

  4. По соображениям производительности нам пришлось сделать csdl, msl и ssdl в качестве встроенных ресурсов

  5. Ваш edmx должен быть постоянно синхронизирован с вашей БД, или, по крайней мере, при попытке обновить edmx он попытается синхронизироваться и может вызвать некоторые неясные ошибки, если они отсутствуютof sync.

  6. Помните, что у ваших сущностей (таблиц / представлений) всегда должен быть первичный ключ, иначе вы получите непонятные ошибки.Смотрите мой другой вопрос здесь

Вещи, которые мы сделали / я мог бы рассмотреть в будущем при использовании EF

  1. Использовать несколькоedmx с помощью 1 edmx для таблиц, логически сгруппированных / связанных друг с другом.Помните о том, что если вы сделаете это, каждый edmx должен жить в своем собственном пространстве имен.Если вы попытаетесь добавить 2 связанные таблицы (скажем, person & address) в 2 edmx в одном и том же пространстве имен, вы получите ошибку компилятора о том, что отношение внешнего ключа уже определено.(Совет: создайте папку и создайте edmx в этой папке. Если вы попытаетесь изменить пространство имен в edmx, не имея папки, оно не сохранит правильно пространство имен при следующем открытии / редактировании)

    fewer tables in edmx => less heavy
    container => good
    

    меньше таблиц в edmx => легче объединять при объединении 2 ветвей

  2. Помните, что контекст объекта не является потокобезопасным

  3. Ваш репозиторий (или какой-либо DAO, который вы используете) должен нести ответственность за создание и удаление контейнера, который он создает.Использование DI-фреймворков, особенно в веб-приложении, усложнило нам задачу.Веб-запросы обслуживаются из пула потоков, и контейнер не был правильно удален после того, как веб-запрос был обработан, поскольку сам поток не был удален.Контейнер был повторно использован (когда поток был повторно использован) и создал много проблем с параллелизмом

  4. Не доверяйте своей VS IDE.Получить хороший редактор XML и знать, как редактировать файл EDMX (хотя вам не нужно редактировать конструктор).Запачкайте руки

  5. ВСЕГДА ВСЕГДА ВСЕГДА (просто не могу это подчеркнуть) запускайте профилировщик SQL (и я имею в виду каждый шаг вашего кода), когда вывыполнить ваши запросы.Насколько сложным может показаться запрос, вы будете удивлены, обнаружив, сколько раз вы нажали на БД. Пример: (извините, не удалось получить код в нужном формате, кто-то может отформатировать его?)

    var myOrders = from t in context.Table where t.CustomerID=123
    

    выберите т;// вышеупомянутый запрос еще не выполнен

    if(myOrders.Count>0)//DB query to find count { var firstOrder = myOrders.First()//DB query to get first result }

    Лучший подход

    // запрос материализован, только 1 попадание в БД, поскольку мы используем ToList () var myOrders =(из t в Context.tables, где t.customerID = 123 выберите t) .ToList ();

    if(myOrders.Count>0)//no DB hit
    {
    //do something
    var myOrder = myOrders[0];//no DB hit
    }
    
  6. Знать, когда использовать отслеживание и не отслеживать (только для чтения)и веб-приложения читают больше, чем записывают.Установите их правильно, когда вы инициализируете свой контейнер

  7. Я забыл скомпилированные запросы?Посмотрите здесь , чтобы узнать больше вкусностей

  8. При получении тысяч строк отвашей БД, убедитесь, что вы используете IQueryable и отсоедините objectContext , чтобы вам не хватило памяти

Обновление:

Джули Лерман решает ту же проблему с помощью аналогичного решения .Ее пост также указывает на работу Ward по работе с огромным количеством таблиц

1 голос
/ 24 июня 2010

Вы знаете, мне было бы интересно, если бы разработчики могли дать некоторое представление об этом.Кажется, что любые примеры Entity Framework состоят только из десяти-двадцати таблиц, что на самом деле является мелким масштабом.

Как насчет использования EF в базе данных с сотнями или даже тысячами таблиц?

ЛичноЯ знаю нескольких разработчиков и организаций, которые были сожжены LINQ-to-SQL и удерживают в течение года или около того, чтобы посмотреть, в каком направлении движется EF.

1 голос
/ 24 июня 2010

Начиная с Entity Framework 4 (с Visual Studio 2010), сгенерированный код выводится из файлов T4 (Text Template Transformation Toolkit), которые вы можете редактировать, чтобы иметь полный контроль над тем, что генерируется. См. блог Олега Сыча , который является источником информации о T4. Генерация кода не проблема, и T4 открывает так много перспектив, без которых я больше не могу жить.

В настоящее время я работаю над проектом, в котором мы используем Entity Framework 4 для уровня доступа к данным, а Scrum - как метод управления гибкими проектами. От одного спринта к другому добавляется несколько таблиц, другие изменяются, добавляются новые требования. Когда вы один раз сталкивались с каждой потенциальной проблемой EF (например, зная, что значения по умолчанию из базы данных не сохраняются по умолчанию в файле .edmx, или если для столбца, который можно обнулять, не устанавливается значение NULL, и обновление конструктора не изменяет свойство сопоставления состояние), ты в порядке.

Редактировать: чтобы ответить на ваш вопрос, это EF 4, генерация кода которого основана на T4, а не на T4, поддерживающем EF. На EF 3.5 (или EF 1.0, если вы предпочитаете) вы можете теоретически использовать T4, записывая их с нуля, анализируя файл EDMX в коде T4 и создавая ваши сущности. Было бы довольно много работы, учитывая, что все это уже сделано в EF 4. Кроме того, Entity Framework 3.5 поддерживает только один тип полномочий, тогда как EF 4 как встроенные или загружаемые шаблоны для объектов POCO (которые ничего не знают). о постоянстве), Самостоятельно отслеживаемые объекты ...

Что касается самой Entity Framework, я думаю, что ей не хватало многих функций в ее первом выпуске, и, хотя ее можно было использовать, это было довольно сложно использовать. EF4 намного улучшен. В нем по-прежнему отсутствуют некоторые базовые функции (например, поддержка enum), но теперь он стал моим предпочтительным уровнем доступа к данным.

1 голос
/ 24 июня 2010

Я не слишком знаком с Entity Framework, но я считаю, что он просто генерирует файл EDM, который можно редактировать вручную.Я знаю, что делал это довольно часто с DBML-файлами Linq-to-SQL, которые генерирует дизайнер (зачастую их проще редактировать вручную, чем использовать дизайнер для небольших настроек).

...