Я считаю, что в производительности вообще нет разницы. 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="data source=.\sqlexpress;
initial catalog=MyDb;integrated security=True;
multipleactiveresultsets=True;App=EntityFramework""
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?Я не знаю.