我正在玩SQL Server Compact Edition 4 CTP1,因为我想将它用作低流量网络应用的数据存储区。当我尝试使用指定DataContext
的连接字符串创建System.Data.SqlServerCe.4.0
时(为了使用LINQ To SQL),我收到以下错误消息:
Cannot open '|DataDirectory|\data.sdf'. Provider 'System.Data.SqlServerCe.3.5' not installed.
那么为什么我的代码不使用SQL CE的第4版?
背景故事:我正在使用Visual Web Developer Express 2010进行开发,但我下载了WebMatrix测试版,并使用其设计器创建了包含一些测试数据的SQL CE 4 .sdf
文件。
使用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
});
Web.config
中的连接字符串如下:
<add name="Main" connectionString="Data Source=|DataDirectory|\data.sdf" providerName="System.Data.SqlServerCe.4.0" />
这非常有效,所以我知道连接字符串是正确的,我已经正确设置了二进制文件等等。所以我想我会尝试一些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; }
}
}
然后在控制器中(db
是在控制器构造函数中构造的Repository
):
var tmp = db.TestEntities.ToDictionary(x => x.ID.ToString(), x => x.Name);
return View(new TestViewModel {
Items = tmp
});
但是当我使用此代码查看页面时,我收到上述错误:
Cannot open '|DataDirectory|\data.sdf'. Provider 'System.Data.SqlServerCe.3.5' not installed.
如何强制我的应用使用正确的版本?有人可以帮忙吗?
答案 0 :(得分:7)
SQL Server Compact 4.0不支持LINQ to SQL,只有Entity Framework / LINQ to Entities。但是如果你将版本4 SqlCeConnection传递给DataContext构造函数,它实际上会工作!