Есть ли разница в производительности между Model First и Code First в MS Entity Framework 4.1? - PullRequest
6 голосов
/ 16 июля 2011

Я начинаю новую разработку и планирую использовать Code First в Entity Framework 4.1.

Ранее я использовал Model First и обнаружил некоторые проблемы с производительностью, связанные с загрузкой контекста, первыми вызовами SaveChanges () и тем, где включается исправление ассоциации.

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

Спасибо.

Ответы [ 3 ]

6 голосов
/ 17 июля 2011

Я считаю, что в производительности вообще нет разницы. Code-First, Model-First, Database-First - это стратегии моделирования в время разработки . Для классов сущностей Model-First и Database-First будет создан DbContext с шаблоном T4. В время выполнения EF 4.1 просто работает с этими классами, и не имеет значения, откуда они берутся - от руки (Code-First) или автоматически генерируются из шаблона T4 (Model-First, Database-First).

Также имейте в виду, что выгода, которую дает Model-First, довольно ограничена, на мой взгляд: у вас просто есть возможность создавать классы моделей на поверхности проектирования в VS2010. Но есть и другие недостатки с другой стороны: шаблон по умолчанию T4 не очень хорошо детализирован при создании кода из модели. Например: он не помещает атрибуты MaxLength в свойства, он всегда создает свойства навигации по обеим сторонам отношения (вам часто не нужны и не нужны обе стороны) и переопределенный метод OnModelCreating в DbContext просто содержит единственную строку throw new UnintentionalCodeFirstException();, которая не особенно впечатляет. Вы можете изменить шаблон и часть CSDL файла EDMX, чтобы добиться большей детализации при создании классов модели и DbContext (спасибо Ladislav за его комментарий ниже об этой опции).

Другими словами, весьма вероятно, что вам придется настроить сгенерированный код (добавление атрибутов, удаление нежелательных свойств навигации, добавление кода отображения Fluent и т. Д.), Чтобы получить заранее настроенные классы моделей, с которыми вы хотите работать. Как только вы это сделаете, станет трудно вносить какие-либо изменения в конструктор моделей, потому что генератор DbContext перезапишет все ваши сделанные вручную изменения в коде.

По моему мнению, Model-First с EF 4.1 полезна только в том случае, если у вас уже есть модель, созданная на поверхности конструктора, например, из более старого проекта EF 4.0, и вы хотите перенести свой проект в EF 4.1. В этом случае генератор DbContext может быть полезно создать начальный код для вас. С этого момента я продолжу работать только в одном коде, что означает: работа с Code-First. Если вы начнете с нового проекта, я бы предпочел Code-First с самого начала. Даже если вы действительно хотите или нуждаетесь в этом визуальном представлении модели на поверхности конструктора, также в Code-First вы можете просто создать файл EDMX из вашего DbContext и открыть его в VS2010, чтобы показать классы модели и их отношения в конструкторе:

using (var context = new MyDbContext())
{
    using (var writer = new XmlTextWriter(@"c:\MyModel.edmx", Encoding.Default))
    {
        EdmxWriter.WriteEdmx(context, writer);
    }
}

Редактировать

На самом деле, есть одна точка, в которой EF 4.1 распознает разницу, происходит ли модель из Model-First (т. Е. Файл модели EDMX и поверхность конструктора) или это чистая модель Code-First - и это строка соединения. Если вы создаете модель из Model-First, вы получаете строку подключения, которая содержит ссылки на файлы метаданных модели, например:

<add name="MyConnectionString" 
     connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl
         |res://*/Model.msl;provider=System.Data.SqlClient;
         provider connection string=&quot;data source=.\sqlexpress;
         initial catalog=MyDb;integrated security=True;
         multipleactiveresultsets=True;App=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />

В то время как для Code-First используется просто «обычная» строка соединения без ссылок на метаданные:

<add name="MyConnectionString" 
     connectionString="Server=.\SQLEXPRESS;Database=MyDb;Trusted_Connection=Yes;"
     providerName="System.Data.SqlClient" />

Теперь вы можете без проблем использовать вторую простую строку подключения для модели, созданной с помощью Model-First. Но приведенный выше фрагмент кода (создание EDMX из DbContext) вызывает исключительную ситуацию с первой строкой соединения, говорящей о том, что WriteEdmx может использоваться только с Code-First, но не Model-First или Database-First. Поэтому очевидно, что DbContext обрабатывает или каким-то образом хранит информацию метаданных из строки подключения.

Как это интерпретировать?Означает ли это, что он на самом деле использует данные в файле EDMX, указанном в строке подключения, когда модель встроена в память?В этом случае теоретически может быть разница в производительности между Code-First и Model-First (по крайней мере, во время сборки модели).Но я не думаю, что метаданные на самом деле обрабатываются.Но упомянутое исключение несколько странно.Почему EF 4.1 мешает мне создать файл модели EDMX, когда моя модель происходит из Model-First?Может быть, просто чтобы избежать путаницы и путаницы с двумя файлами EDMX?Я не знаю.

1 голос
/ 19 марта 2012

Да, существуют различия в производительности между Model First (EF 4.0) и Code First (EF 4.1 - 4.3.1):

  • Вы не можете предварительно сгенерировать представления внутреннего запроса . Это означает, что каждый раз, когда EF пытается выполнить свой первый запрос (для домена приложения), ему необходимо выполнить дорогостоящую операцию для генерации этих представлений, в зависимости от сложности вашей модели. Это обычно влияет на производительность запуска приложения и может сделать отладку довольно раздражающей.

  • Вы не можете использовать скомпилированные запросы . Это может серьезно повлиять на часто используемые запросы, особенно сложные запросы. Это может стать серьезным узким местом и нагрузкой на процессор. Только EF 5.0 (который будет включен в .NET 4.5) исправляет эту проблему, автоматически компилируя все запросы, включая запросы Code First.

0 голосов
/ 20 февраля 2014

Согласно этому беншмарку да .В нем также говорится, что EF Model First всегда быстрее, чем EF Code First.

...