为什么我的DataContext不会使用SQL Server Compact Edition 4,而不是尝试使用3.5?

Mar*_*ell 7 sql-server-ce linq-to-sql sql-server-ce-4 asp.net-mvc-2

我正在使用SQL Server Compact Edition 4 CTP1,因为我想将它用作低流量Web应用程序的数据存储.当我尝试创建一个DataContext连接字符串指定System.Data.SqlServerCe.4.0(为了使用LINQ To SQL)时,我收到以下错误消息:

Cannot open '|DataDirectory|\data.sdf'. Provider 'System.Data.SqlServerCe.3.5' not installed.
Run Code Online (Sandbox Code Playgroud)

那么为什么我的代码不使用SQL CE的第4版?

背景故事:我正在使用Visual Web Developer Express 2010进行开发,但我下载了WebMatrix测试版并使用其设计器创建了.sdf包含一些测试数据的SQL CE 4 文件.

使用这些SqlCeConnection/SqlCeCommand/SqlCeDataReader类,我成功创建了一个基本的MVC应用程序,它可以检索测试数据并显示它.SQL CE 4二进制文件将复制到应用程序的bin文件夹中.在我的控制器中:

var connectionString = ConfigurationManager.ConnectionStrings["Main"].ConnectionString;
var tmp = new Dictionary<string, string>();

using(var conn = new SqlCeConnection(connectionString))
{
    conn.Open();

    using (SqlCeDataReader r = new SqlCeCommand("select * from ttest", conn).ExecuteReader())
    {
        while (r.Read())
        {
            tmp.Add(r["id"].ToString(), r["name"].ToString());
        }
    }
}

return View(new TestViewModel { 
    Items = tmp
});
Run Code Online (Sandbox Code Playgroud)

连接字符串Web.config如下:

<add name="Main" connectionString="Data Source=|DataDirectory|\data.sdf" providerName="System.Data.SqlServerCe.4.0" />
Run Code Online (Sandbox Code Playgroud)

这很好用,所以我知道连接字符串是正确的,我已经正确地设置了二进制文件等等.所以我想我会尝试一些LINQ To SQL的东西,这就是我想要构建真正的应用程序的方式:

[Table(Name = "tTest")]
public class TestEntity
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int ID { get; set; }
    [Column]
    public string Name { get; set; }
}

public class Repository
{
    private Table<TestEntity> testTable;

    public Repository()
    {
        var connectionString = ConfigurationManager.ConnectionStrings["Main"].ConnectionString;
        var context = new DataContext(connectionString);
        testTable = context.GetTable<TestEntity>();
    }

    public IQueryable<TestEntity> TestEntities
    {
        get { return testTable;  }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在控制器(db被一个Repository在控制器构造构造):

var tmp = db.TestEntities.ToDictionary(x => x.ID.ToString(), x => x.Name);

return View(new TestViewModel { 
    Items = tmp
});
Run Code Online (Sandbox Code Playgroud)

但是当我使用此代码查看页面时,我收到上述错误:

Cannot open '|DataDirectory|\data.sdf'. Provider 'System.Data.SqlServerCe.3.5' not installed.
Run Code Online (Sandbox Code Playgroud)

如何强制我的应用使用正确的版本?有人可以帮忙吗?

Eri*_*kEJ 7

SQL Server Compact 4.0不支持LINQ to SQL,只有Entity Framework/LINQ to Entities.但是如果你将版本4 SqlCeConnection传递给DataContext构造函数,它实际上会工作!

  • 这里是支持链接,说SQL CE 4不能与Linq一起使用SQL:http://blogs.msdn.com/b/sqlservercompact/archive/2011/01/12/microsoft-sql-server-compact-4- 0-IS-可供download.aspx (2认同)