11

Tengo un sitio web ASP.NET MVC 3 Beta con SQL Server CE 4.0. Con tanto ScottGu's NerdDinner example y mi propio código, voy a veces obtener la siguiente excepción en cuanto intento acceder a la base de datos:¿Por qué EF4 intenta volver a crear mi base de datos a pesar de que el modelo no ha cambiado?

 
File already exists. Try using a different database name. 
[ File name = D:\Sourcecode\NerdDinner\NerdDinner\App_Data\NerdDinners.sdf ] 

Line 17:   public ActionResult Index() 
Line 18:   { 
Line 19:    var dinners = from d in nerdDinners.Dinners 
Line 20:       where d.EventDate > DateTime.Now 
Line 21:       select d; 

[SqlCeException (0x80004005): File already exists. Try using a different database name. [ File name = D:\Sourcecode\NerdDinner\NerdDinner\App_Data\NerdDinners.sdf ]] 
    System.Data.SqlServerCe.SqlCeEngine.ProcessResults(IntPtr pError, Int32 hr) +92 
    System.Data.SqlServerCe.SqlCeEngine.CreateDatabase() +1584 
    System.Data.SqlServerCe.SqlCeProviderServices.DbCreateDatabase(DbConnection connection, Nullable`1 timeOut, StoreItemCollection storeItemCollection) +287 
    System.Data.Objects.ObjectContext.CreateDatabase() +84 
    System.Data.Entity.Internal.DatabaseOperations.Create(ObjectContext objectContext) +35 
    System.Data.Entity.Infrastructure.Database.Create() +70 
    System.Data.Entity.Infrastructure.CreateDatabaseOnlyIfNotExists`1.InitializeDatabase(TContext context) +360 
    System.Data.Entity.Infrastructure.Database.Initialize() +272 
    System.Data.Entity.Internal.InternalContext.Initialize() +90 
    System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) +34 
    System.Data.Entity.Internal.Linq.EfInternalQuery`1.Initialize() +140 
    System.Data.Entity.Internal.Linq.EfInternalQuery`1.get_Provider() +29 
    System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider() +34 
    System.Linq.Queryable.Where(IQueryable`1 source, Expression`1 predicate) +63 
    NerdDinner.Controllers.HomeController.Index() in D:\Sourcecode\NerdDinner\NerdDinner\Controllers\HomeController.cs:19 

No puedo entender por qué esto funciona a veces con un archivo .dbf existente y otras veces se queja Incluso he intentado establecer explícitamente el comportamiento predeterminado con

Database.SetInitializer(new CreateDatabaseOnlyIfNotExists<...>()); 

¿Alguien más ha experimentado esto?

  • Reiniciar Cassini no parece marcar la diferencia.
  • Pulsar actualizar en IE después de recibir este error hará que la misma página cargue correctamente.
+0

Desde su StackTrace: 'CreateDatabaseOnlyIfNotExists'. El EF * intenta * hacer lo correcto. Pero de alguna manera el cheque para ver si el DB existe falló. Mira eso. –

+0

Aquí está lo extraño. Cargar el código/símbolos de .NET Framework y depurar el código en realidad detiene el problema. Cada vez. No lo entiendo – Jedidja

Respuesta

1

Instalar y utilizar SQL Server CE CTP1, que todavía se puede descargar en Microsoft sites. Esto resolvió mi problema con eso.

3

Parece que se trata de un error descubierto recientemente. MSDN Forum

La solución es volver a instalar SQL Server CE 4.0 CTP 1 download

8

momento de resucitar una vieja pregunta, pero yo estaba experimentando esto hoy y he encontrado una solución que no implica la instalación de un mayor versión del CTP.

desde la dirección URL correcta para la entrada de blog es http://www.hanselman.com/blog/PDC10BuildingABlogWithMicrosoftUnnamedPackageOfWebLove.aspx (alrededor de la mitad de camino a través de la entrada de blog)

* Ir en su archivo AppStart_SQLCEEntityFramework.cs y la línea DefaultConnectionFactory a esto: *

Database.DefaultConnectionFactory = new SqlCeConnectionFactory( 
    "System.Data.SqlServerCe.4.0", 
    HostingEnvironment.MapPath("~/App_Data/"),""); 

Mi base de datos particular se coloca en la carpeta App_Data, pero supongo que, si la tuya no lo es, deberías poder cambiar la ruta para adaptarla y funcionará.

Espero que esto ayude!

+0

Brillante, eso me ayudó de todos modos. –

+0

Acabo de hacer esto hoy con el nuevo lanzamiento 4.1 de EF ... :-) – klabranche

1

que tenían el mismo problema hoy con MVC3 liberado y SQL Server CE 4.0 descargado con NuGet y se resolvió eliminando el comentario de la línea:

DbDatabase.SetInitializer(new CreateCeDatabaseIfNotExists<MyContext>()); 

y sustitución de MyContext con la clase de contexto que se hereda de DBContext en la carpeta de modelos.

Cuestiones relacionadas