11

Possiedo un sito Web ASP.NET MVC 3 Beta che utilizza SQL Server CE 4.0. Con entrambi ScottGu's NerdDinner example e il mio codice, io a volte ottenere la seguente eccezione non appena provo ad accedere al database:Perché EF4 sta cercando di ricreare il mio database anche se il modello non è cambiato?

 
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 

io non riesco a capire il motivo per cui questo funziona a volte con un file .dbf esistente e altre volte si lamenta. Ho anche provato ad impostare esplicitamente il comportamento predefinito con

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

Qualcun altro ha provato questo?

  • riavviare Cassini non sembra fare la differenza.
  • Quando si riceve l'aggiornamento in IE dopo aver ricevuto questo errore, verrà correttamente caricata la stessa pagina esatta.
+0

Dal tuo stacktrace: 'CreateDatabaseOnlyIfNotExists'. L'EF sta * cercando * di fare la cosa giusta. Ma in qualche modo il controllo per vedere se il DB esiste fallito. Guarda in quello. –

+0

Ecco la cosa strana. Il caricamento del codice/dei simboli di .NET Framework e il debug del codice in realtà impediscono il verificarsi del problema. Ogni volta. Non capisco – Jedidja

risposta

1

Installare e utilizzare SQL Server CE CTP1, che è ancora scaricabile su Microsoft sites. Questo ha risolto il mio problema.

3

Sembra che questo sia un bug scoperto di recente. MSDN Forum

La soluzione è quella di reinstallare SQL Server CE 4.0 CTP 1 download

8

dispiace di far risorgere un tale vecchia questione, ma stavo sperimentando questo oggi e hanno trovato una soluzione che non comporta l'installazione di un vecchio versione del CTP.

Da l'URL corretto per il blogpost è http://www.hanselman.com/blog/PDC10BuildingABlogWithMicrosoftUnnamedPackageOfWebLove.aspx (circa a metà strada attraverso il post sul blog)

* Andate nel file AppStart_SQLCEEntityFramework.cs e la linea DefaultConnectionFactory a questo: *

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

Il mio particolare database è inserito nella cartella App_Data ma presumo che se il tuo non lo è dovresti essere in grado di cambiare il percorso per adattarlo e funzionerà.

Spero che questo aiuti!

+0

Brillante, mi ha aiutato comunque. –

+0

L'ho fatto oggi con la nuova versione 4.1 di EF ... :-) – klabranche

1

Ho avuto lo stesso problema di oggi con MVC3 rilasciato e SQL Server CE 4.0 scaricato con NuGet ed è stato risolto decommentando la linea:

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

e sostituendo myContext con la classe contesto che è stato ereditato da DbContext in la cartella dei modelli.