Почему мой DataContext не использует SQL Server Compact Edition 4, а не пытается использовать 3.5? - PullRequest
7 голосов
/ 03 декабря 2010

Я играю с 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.

Так почему мой код не используетверсия 4 SQL CE?

История вопроса: я использую 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.

Как заставить мое приложение использовать правильную версию?Кто-нибудь может помочь?

1 Ответ

7 голосов
/ 04 декабря 2010

LINQ to SQL не поддерживается SQL Server Compact 4.0, только Entity Framework / LINQ to Entities.Но если вы передадите SqlCeConnection версии 4 конструктору DataContext, он действительно будет работать!

...