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

标签 linq-to-sql asp.net-mvc-2 sql-server-ce sql-server-ce-4

我在玩 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 beta 并使用其设计器创建了 SQL CE 4 .sdf包含一些测试数据的文件。

使用 SqlCeConnection/SqlCeCommand/SqlCeDataReader类,我已经成功创建了一个基本的 MVC 应用程序,它检索测试数据并显示它。 SQL CE 4 二进制文件被复制到应用程序的 bin 中。文件夹。在我的 Controller 中:
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;  }
    }
}

然后在 Controller 中(db 是在 Controller 构造函数中构造的 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.

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

最佳答案

SQL Server Compact 4.0 不支持 LINQ to SQL,仅支持 Entity Framework /LINQ to Entities。但是,如果您将版本 4 SqlCeConnection 传递给 DataContext 构造函数,它实际上会起作用!

关于linq-to-sql - 为什么我的 DataContext 不使用 SQL Server Compact Edition 4,而不是尝试使用 3.5?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4349385/

相关文章:

c# - "new"inside concrete type projection 只被调用一次

sql-server-2005 - Linq-to-SQL 忽略 SQL Server 默认值

c# - 使用 C# 在 LINQ 查询中获取连接表 MAX 值的最有效方法

validation - 关于构建 asp.net mvc 应用程序的建议

c# - IIS7 ASP.NET MVC 2 Assets 缓存模块不工作

C# - 将 null 插入到 SQL Compact Edition 表中

azure - Azure 网站上的 SQL Server CE

c# - 使用存储库模式进行查询

javascript - KnockoutJS 绑定(bind)问题 - 无法读取属性

sql-server - 为少数用户应用程序选择合适的数据库