最近开发一个带有local data的WPF项目时遇到一个异常:Unable to determine the provider name for connection of type 'System.Data.SqlServerCe.SqlCeConnection'。
开发环境是:在VS2010 sp1下使用Entity Framework 4.1(Code-First) + Sql Compact Edition3.5 + WPF。
这个异常在我自己的电脑上没有遇到,但是在公司的电脑里这个问题就是过不去。在网上找了一圈,但是大多和我遇到的不一样,所以搁置了几天,不过今天有幸解决了,分享一下。
在我的情况下,这个异常是由于所安装的数据库不同造成的。我自己电脑里使用的Sql Server 2008,默认自带Sql Compact Edition3.5,但是公司电脑里安装的是Sql Server 2008 R2,虽然默认也带有3.5版的local data,但是当将连接字符串写好后,无法连接本地数据库(local data),并提示上面的错误。
在正常的情况下,即Sql Server 2008 + Sql Compact Edition3.5,使用VS 2010创建的local data是3.5版本的,这样Entity Framework 4.1(Code-First) 的连接字符串如下:
<connectionStrings>
<add name="OfflineContext" connectionString="Data Source=OfflineDb.sdf" providerName="System.Data.SqlServerCe.3.5" />
</connectionStrings>
其中,OfflineContext是EF(Code-First)中DbContext类的继承类,OfflineDb.sdf被放置在项目的根目录下,而providerName必须是System.Data.SqlServerCe.3.5这个值,呵呵,我开始就被这个给难住了。后来知道,它实际上是在machine.config(<windir>\Microsoft.NET\Framework\v4.0.30319\Config\)中定义的,我电脑里的情况如下:
<system.data>
<DbProviderFactories>
<add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
</DbProviderFactories>
</system.data>
但是如果你电脑里安装的是Sql Server 2008 R2版,你需要再安装一下Sql Compact Edition 4.0。 至于原因可能是当你安装Sql Server 2008 R2后,VS2010会自动创建4.0版的local data,这样你如果使用之前的连接字符串配置,就会得到标题里的错误。安装好4.0后,你只需修改连接字符串如下:
<connectionStrings>
<add name="OfflineContext" connectionString="Data Source=OfflineDb.sdf" providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>
当然,在安装完Sql Compact Edition 4.0后,machine.config文件里也会多出一个Sql Compact Edition 4.0的配置节。
呵呵,描述完毕,希望对他人有点帮助吧。