以下是我的一个使用实体框架的控制台应用程序的配置:
<?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="data source=.;initial catalog=EfTest;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
我将providerName
称为System.Data.EntityClient
。但是在这里,我没有任何entityFramework
部分,我给了名称为System.Data.EntityClient
的提供商。我的申请仍然有效。我的应用程序能够连接到连接字符串中的数据库,并执行通过实体框架上下文定向的内容。
为什么后面的连接字符串只适用于EF,即使应用程序配置文件中缺少Providers
信息?它丢失了还是位于其他地方?
答案 0 :(得分:1)
第一个连接字符串用于代码优先方法。那个没有指定.csdl
,.ssdl
和.msl
个文件。 EF将从您的代码优先模型生成这些文件。在此连接字符串中,您需要指定providerName="System.Data.SqlClient"
。
在第二个应用程序中,连接字符串用于数据库第一种方法。正如您所看到的那样,指定.csdl
,.ssdl
和.msl
文件。它在连接字符串中也有这个:provider=System.Data.SqlClient
和providerName="System.Data.EntityClient"
。因此,它知道使用EntityClient
作为EF的数据提供程序,并SqlClient
作为SQL Server的数据提供程序。
因此,它就在那里。但它们在代码优先和数据库优先方面是不同的。