MS Entity Framework 4.1中的Model First和Code First之间是否存在性能差异?

Mar*_*low 6 performance entity-framework ef-code-first entity-framework-4.1

我正在开始一个新的开发,我计划在Entity Framework 4.1中使用Code First.

我之前使用过Model First,发现了一些关于加载上下文的性能问题,第一次调用SaveChanges()以及Association Fix-up开始的地方.

有没有人比较过这两种技术的表现 - 或者,在一天结束时它们是微不足道的?

谢谢.

Sla*_*uma 6

我相信在表现上没有任何区别.Code-First,Model-First,Database-First是设计时的建模策略.对于Model-First和Database-First实体类,DbContext将使用T4模板创建a.在运行时, EF 4.1只适用于那些类,它们来自何处 - 手写(代码优先)或从T4模板(模型优先,数据库优先)自动生成.

还要记住,Model-First为您提供的好处在我看来相当有限:您可以在VS2010中的设计图面上创建模型类.但另一方面存在更多缺点:默认 T4模板在从模型创建代码时并不是很精细.例如:它不会在MaxLength属性上放置属性,它会在关系的两边创建始终的导航属性(通常不需要并且需要双方),并且重写的OnModelCreating方法DbContext只包含不是单行throw new UnintentionalCodeFirstException();而不是特别令人印象 您可以修改EDMX文件的模板和CSDL部分,以便在生成模型类和DbContext时获得更多粒度(感谢Ladislav在下面关于此选项的评论).

换句话说,您很可能必须调整生成的代码(添加属性,删除不需要的导航属性,添加Fluent映射代码等),以便获得您想要使用的精细模型类.一旦完成此操作,就很难在模型设计器中进行任何更改,因为DbContext生成器将覆盖代码中所有手工更改.

在我看来,使用EF 4.1的Model-First只有在设计器表面设计的模型(例如旧的EF 4.0项目)并且您希望将项目迁移到EF 4.1时才有用.在这种情况下,DbContext生成器可能很有用为您创建初始代码.从那时起,我将继续单独使用代码,这意味着:使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

实际上有一点,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" />
Run Code Online (Sandbox Code Playgroud)

对于Code-First,只使用没有元数据引用的"普通"连接字符串:

<add name="MyConnectionString" 
     connectionString="Server=.\SQLEXPRESS;Database=MyDb;Trusted_Connection=Yes;"
     providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)

现在,对于通过Model-First创建的模型,您也可以使用第二个简单连接字符串而不会出现问题.但上面的代码片段(从DbContext创建EDMX)会抛出一个异常,第一个连接字符串告诉它WriteEdmx只能用于Code-First但不能用于Model-First或Database-First.显然,DbContext以某种方式处理或存储来自连接字符串的元数据信息.

如何解释这个?当模型在内存中构建时,是否意味着它实际使用连接字符串中指定的EDMX文件中的数据?在这种情况下,理论上可能存在Code-First和Model-First之间的性能差异(至少在模型构建时).但我不认为元数据实际上是处理过的.但提到的例外有点奇怪.当我的模型来自Model-First时,为什么EF 4.1阻止我创建EDMX模型文件?也许只是为了避免混淆和混乱两个EDMX文件?我不知道.