我相信性能上完全没有区别。代码优先、模型优先、数据库优先是设计时的建模策略。对于 Model-First 和 Database-First 实体类,DbContext 将使用 T4 模板创建。在运行时,EF 4.1 只适用于这些类,它们来自哪里并不重要 - 手写(代码优先)或从 T4 模板自动生成(模型优先,数据库优先) .
另外请记住,在我看来,Model-First 给您带来的好处是相当有限的:您只能在 VS2010 的设计图面上创建模型类。但另一方面也有更多的缺点:default T4 模板在从模型创建代码时不是很精细。例如:它不会将MaxLength 属性放在属性上,它总是在关系的两侧创建导航属性(您通常不想要并且需要双方)以及DbContext 中覆盖的OnModelCreating 方法只包含单行throw new UnintentionalCodeFirstException();,这并不是特别令人印象深刻。您可以修改 EDMX 文件的模板和 CSDL 部分,以便在生成模型类和 DbContext 时获得更多粒度(感谢 Ladislav 在下面对此选项的评论)。
换句话说,您很可能必须调整生成的代码(添加属性、删除不需要的导航属性、添加 Fluent 映射代码等)才能获得您想要使用的微调模型类。完成此操作后,很难在模型设计器中进行任何更改,因为 DbContext 生成器将覆盖您在代码中手动进行的所有更改。
在我看来,EF 4.1 的 Model-First 仅在您已经在设计器界面中设计了模型(例如从较旧的 EF 4.0 项目中设计)并且您希望将项目迁移到 EF 4.1 时才有用。在这种情况下,DbContext 生成器可能有助于为您创建 initial 代码。从那时起,我将继续单独使用代码,这意味着:使用 Code-First。如果您从一个新项目开始,我会从一开始就更喜欢 Code-First。即使您真的想要或需要在 Code-First 中的设计器表面中的模型的这种可视化表示,您也可以简单地从您的 DbContext 创建一个 EDMX 文件并在 VS2010 中打开它以显示您的模型类及其在设计器中的关系:
using (var context = new MyDbContext())
{
using (var writer = new XmlTextWriter(@"c:\MyModel.edmx", Encoding.Default))
{
EdmxWriter.WriteEdmx(context, writer);
}
}
编辑
实际上,EF 4.1 有一点可以识别模型是来自模型优先(即 EDMX 模型文件和设计器表面)还是纯代码优先模型 - 这就是连接字符串。如果您从 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 创建的模型。但是上面的代码 sn-p(从 DbContext 创建一个 EDMX)会抛出一个异常,第一个连接字符串告诉 WriteEdmx 只能用于代码优先,但不能用于模型优先或数据库优先。所以显然 DbContext 以某种方式处理或存储来自连接字符串的元数据信息。
如何解释这个?是不是说在内存中建立模型时,它实际上使用了连接字符串中指定的 EDMX 文件中的数据?在这种情况下,理论上代码优先和模型优先之间可能存在性能差异(至少在模型构建时)。但我认为元数据实际上并没有被处理。但是提到的异常有点奇怪。当我的模型来自 Model-First 时,为什么 EF 4.1 阻止我创建 EDMX 模型文件?也许只是为了避免可能的混淆和弄乱两个 EDMX 文件?我不知道。