使用Entity Framework连接SQL Server Compact的连接字符串是什么?

10

我已经厌倦了通过谷歌搜索来解决这个问题。我已经安装了SQL Server CE 4.0,并拥有EF 4.1,但我无法获得正确的连接字符串。在connectionstrings.com中没有适用于我的内容。

我只想创建一个SqlCeEngine对象,但无论我尝试什么,都会出现一些异常。最近出现的是:

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

之后跟着"metadata"、"app"、"provider"或"provider connection string"。我知道EF需要在连接字符串中包含元数据。我也无法想象没有"provider connection string"该如何操作。

到目前为止,我有以下代码:

<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个回答

13
您可以在您的 App.config 文件中尝试这个方法(适用于 EF5 Code first migrations 和 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


相对路径怎么样?比如说你正在从一个测试项目中测试数据库?我们有没有可能修改连接字符串,使用相对路径来指定数据库的位置呢? - IbrarMumtaz
2
老兄,"|DataDirectory|\Data\ProjectDb.sdf" 是一个相对路径。 - Rowinson Gallego

6

我曾经在使用Entity Framework 5.0 Code First方法与SQL Server Compact Edition 4.0时遇到了同样的问题。

为了解决这个问题,我将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引用。

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;
        }
    }
}

0

你有点混淆了。

对于 SQL Server CE,连接字符串可能非常简单(可能需要将 DbContext 替换为 YourNameSpace.DbContextName):

<add name="DbContext" 
     connectionString="MyDbFile.sdf" 
     providerName="System.Data.SqlServerCe.4.0" />

我也遇到了很多连接问题,所以我做了以下操作:

  • 安装了适用于 SQL Server CE 的 Entity Framework
  • 检查 web.config 文件中是否包含不变的提供程序 System.Data.SqlServerCe.4.0
  • 验证没有字符串字段(将在数据库中表示为列)的长度超过 4000 个符号(要添加限制,请使用注释 [MaxLength(4000)],默认值为 MAX)

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


0

这篇TechNet文章概述了使用EF与SQL Server Compact的步骤。这一行引起了我的注意,可能可以解决你的问题:

确保连接字符串中provider=System.Data.SqlServerCe.3.5

(我认为你应该选择4.0而不是3.5)

试试看,看看情况如何。


仍然给我一个未知的连接选项错误,针对那个特定的提供程序属性。 - Tesserex
这篇文章(http://erikej.blogspot.com/2010/11/using-entity-framework-with-sql-server.html)指出需要更改edmx文件和配置文件,但它也快一年了。如果VS对此没有提供支持,我会感到惊讶,但无法确定... - Rick Liddle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接