Estoy jugando con SQL Server Compact Edition 4 CTP1 ya que me gustaría usarlo como almacén de datos para una aplicación web de poco tráfico. Cuando trato de crear un DataContext
con una cadena de conexión que especifica System.Data.SqlServerCe.4.0
(con el fin de utilizar LINQ to SQL), me sale el siguiente mensaje de error:¿Por qué mi DataContext no usará SQL Server Compact Edition 4, en lugar de tratar de usar 3.5?
Cannot open '|DataDirectory|\data.sdf'. Provider 'System.Data.SqlServerCe.3.5' not installed.
¿Por qué es mi código no utilizando la versión 4 de SQL CE?
Back story: Estoy usando Visual Web Developer Express 2010 para desarrollo, pero descargué la versión beta de WebMatrix y usé su diseñador para crear un archivo SQL CE 4 .sdf
que contiene algunos datos de prueba.
Usando las clases SqlCeConnection/SqlCeCommand/SqlCeDataReader
, he creado con éxito una aplicación MVC básica que recupera los datos de prueba y los muestra. Los archivos binarios de SQL CE 4 se copian en la carpeta bin
de la aplicación. En mi controlador:
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
});
La cadena de conexión en Web.config
es el siguiente:
<add name="Main" connectionString="Data Source=|DataDirectory|\data.sdf" providerName="System.Data.SqlServerCe.4.0" />
Esto funciona perfectamente, así que sé la cadena de conexión es correcta y que he creado los binarios adecuadamente, etc Así que pensé en probar un poco de LINQ To SQL cosas, que es como yo quiero construir la aplicación real:
[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; }
}
}
un d después en el controlador (db
siendo un Repository
construido en el constructor del controlador):
var tmp = db.TestEntities.ToDictionary(x => x.ID.ToString(), x => x.Name);
return View(new TestViewModel {
Items = tmp
});
Pero cuando veo la página de utilizar este código, me sale el error antes mencionado:
Cannot open '|DataDirectory|\data.sdf'. Provider 'System.Data.SqlServerCe.3.5' not installed.
¿Cómo puedo ¿obligar a mi aplicación a usar la versión correcta? ¿Alguien puede ayudar?
También estoy tratando de hacer lo mismo, pero el resultado es un poco diferente, el mensaje de error es que ASP.NET no admite SQLCE. Aunque, estoy usando SQLCE 4.0 RTM. Si tiene éxito, pl. Házmelo saber. –