使用SQL Server Compact和Entity Framework的连接字符串?

时间:2011-08-04 19:19:33

标签: entity-framework-4 sql-server-ce

我为此尝试了谷歌。我已经安装了SQL Server CE 4.0,并且有EF 4.1,但我无法获得正确的连接字符串。 connectionstrings.com上的任何内容都不适用于我。

我只是想创建一个SqlCeEngine对象,但无论我尝试什么,我都会遇到异常。最近一直是

  

连接字符串中的未知连接选项

后面带有“元数据”,“应用”,“提供商”或“提供商连接字符串”。我知道EF需要连接字符串中的元数据。我无法想象如果没有“提供者连接字符串”,任何事情都可以做到。

到目前为止,我有这个:

<add name="DBContext" 
     connectionString="provider connection string=&quot;Data Source=MyDbFile.sdf;Persist Security Info=False;&quot;" 
     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=&quot;Data Source=MyDbFile.sdf;Persist Security Info=False;&quot;" 
     providerName="System.Data.EntityClient" />

是否需要元数据?什么在连接字符串的“app”部分?提供者应该是什么,System.Data.SqlClient或某些SQL Server CE版本? (当我尝试添加引用时,我仍然找不到。我的添加引用窗口仍然只包含System.Data.SqlServerCe版本3.5.1.0。)或者什么都没有?

providerName属性应该包含哪些内容? System.Data.EntityClient是否正确?这就像这里有10个不同的变量,每个组合都给我一个新的同样神秘的错误,其中没有一个在Google上有用。我的智慧结束了。这甚至可能吗?

5 个答案:

答案 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")
    {

    }
}

它会像魅力一样发挥作用。

您可以在此处找到更多信息:http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-2-connections-and-models.aspx

答案 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" />

我在连接方面遇到了很多麻烦,所以我做了以下几点:

  • installed Entity Framework for SQL Server CE
  • 检查web.config是否包含具有不变System.Data.SqlServerCe.4.0
  • 的提供程序
  • 已验证没有字符串字段(将在db中表示为列),长度为max或模式超过4000个符号(添加限制使用注释[MaxLength(4000)],默认情况下== MAX)

当您使用数据库优先模型而不是代码优先时,元数据是必需的,因此有.edmx文件表示生成的数据库模型。