我为此尝试了谷歌。我已经安装了SQL Server CE 4.0,并且有EF 4.1,但我无法获得正确的连接字符串。 connectionstrings.com
上的任何内容都不适用于我。
我只是想创建一个SqlCeEngine
对象,但无论我尝试什么,我都会遇到异常。最近一直是
连接字符串中的未知连接选项
后面带有“元数据”,“应用”,“提供商”或“提供商连接字符串”。我知道EF需要连接字符串中的元数据。我无法想象如果没有“提供者连接字符串”,任何事情都可以做到。
到目前为止,我有这个:
<add name="DBContext"
connectionString="provider connection string="Data Source=MyDbFile.sdf;Persist Security Info=False;""
providerName="System.Data.EntityClient" />
有一次我把它与元数据联系起来:
<add name="DBContext"
connectionString="metadata=res://*/Data.DBContext.csdl|res://*/Data.DBContext.ssdl|res://*/Data.DBContext.msl;provider=System.Data.SqlClient;provider connection string="Data Source=MyDbFile.sdf;Persist Security Info=False;""
providerName="System.Data.EntityClient" />
是否需要元数据?什么在连接字符串的“app”部分?提供者应该是什么,System.Data.SqlClient
或某些SQL Server CE版本? (当我尝试添加引用时,我仍然找不到。我的添加引用窗口仍然只包含System.Data.SqlServerCe
版本3.5.1.0。)或者什么都没有?
providerName
属性应该包含哪些内容? System.Data.EntityClient
是否正确?这就像这里有10个不同的变量,每个组合都给我一个新的同样神秘的错误,其中没有一个在Google上有用。我的智慧结束了。这甚至可能吗?
答案 0 :(得分:13)
您可以在App.config文件中尝试此操作(EF5代码首次迁移和SQL Server CE 4.0):
<connectionStrings>
<add name="DefaultConnection"
providerName="System.Data.SqlServerCe.4.0"
connectionString="Data Source=|DataDirectory|\Data\ProjectDb.sdf"/>
</connectionStrings>
在你ProjectDb
班:
class ProjectDb : DbContext
{
public ProjectDb()
: base("DefaultConnection")
{
}
}
它会像魅力一样发挥作用。
答案 1 :(得分:6)
我在使用SQL Server Compact Edition 4.0的Entity Framework 5.0 Code First方法时遇到了同样的问题
要解决这个问题,我将SqlCeConnection
的实例传递给DbContext
的构造函数:
public class Storage : DbContext
{
public Storage()
: base(new SqlCeConnection("Data Source=Database.sdf;Persist Security Info=False;"),
contextOwnsConnection: true)
{ }
//...
}
如果您不想内联连接字符串,可以从 App.config 到ConfigurationManager
获取它
当然,您应该添加对正确版本的System.Data.SqlServerCe的引用(在“添加引用”对话框中查看“扩展”选项卡)
答案 2 :(得分:0)
This TechNet article概述了将EF与SQL Server Compact一起使用的步骤。这条线向我跳了出来,可以解决你的问题:
确保连接中的 provider = System.Data.SqlServerCe.3.5 字符串。
(我认为你会想要4.0而不是3.5)
尝试一下,看看情况如何。
答案 3 :(得分:0)
Lu55的解决方案对我不起作用,但我找到了解决它的方法。为了仍然使用自动代码生成(可以覆盖生成的文件中的更改),我添加了一个文件,其中包含以下代码:
using System.Data.Entity;
using System.Data.Objects;
namespace MyProject.Data
{
internal partial class Entities : DbContext
{
public Entities(string connectionString)
: base(
new ObjectContext(
@"metadata=res://*/Data.Model.csdl|
res://*/Data.Model.ssdl|
res://*/Data.Model.msl;
provider=System.Data.SqlServerCe.4.0;"),
true)
{
Database.Connection.ConnectionString = connectionString;
}
}
}
答案 4 :(得分:0)
你混了一下。
对于SQL Server CE连接字符串可以非常简单(可能用DbContext
替换YourNameSpace.DbContextName
):
<add name="DbContext"
connectionString="MyDbFile.sdf"
providerName="System.Data.SqlServerCe.4.0" />
我在连接方面遇到了很多麻烦,所以我做了以下几点:
System.Data.SqlServerCe.4.0
[MaxLength(4000)]
,默认情况下== MAX)当您使用数据库优先模型而不是代码优先时,元数据是必需的,因此有.edmx
文件表示生成的数据库模型。