当providerName配置丢失时,实体框架如何工作?

时间:2016-12-25 03:32:27

标签: c# entity-framework

以下是我的一个使用实体框架的控制台应用程序的配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  ....omitted few things for brevity
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
<connectionStrings>
  <add  name="codefirst" connectionString="Data Source=.;Initial Catalog=SomeCatalog;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>

所以这里的连接字符串有一个属性providerName。我将其称为System.Data.SqlClient,因为我已使用此名称在entityFramework部分中定义了一个提供程序。没关系。

但是在下面的配置中,我的另一个控制台应用程序的App.Config文件的完整内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="EfTestEntities" connectionString="metadata=res://*/EFTest.csdl|res://*/EFTest.ssdl|res://*/EFTest.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=EfTest;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

我将providerName称为System.Data.EntityClient。但是在这里,我没有任何entityFramework部分,我给了名称为System.Data.EntityClient的提供商。我的申请仍然有效。我的应用程序能够连接到连接字符串中的数据库,并执行通过实体框架上下文定向的内容。

为什么后面的连接字符串只适用于EF,即使应用程序配置文件中缺少Providers信息?它丢失了还是位于其他地方?

1 个答案:

答案 0 :(得分:1)

第一个连接字符串用于代码优先方法。那个没有指定.csdl.ssdl.msl个文件。 EF将从您的代码优先模型生成这些文件。在此连接字符串中,您需要指定providerName="System.Data.SqlClient"

在第二个应用程序中,连接字符串用于数据库第一种方法。正如您所看到的那样,指定.csdl.ssdl.msl文件。它在连接字符串中也有这个:provider=System.Data.SqlClientproviderName="System.Data.EntityClient"。因此,它知道使用EntityClient作为EF的数据提供程序,并SqlClient作为SQL Server的数据提供程序。

因此,它就在那里。但它们在代码优先和数据库优先方面是不同的。