11

Mam witrynę ASP.NET MVC 3 Beta przy użyciu programu SQL Server CE 4.0. Zarówno ScottGu's NerdDinner example i mój własny kod, będę czasami uzyskać następujący wyjątek jak tylko próbować uzyskać dostęp do bazy danych:Dlaczego EF4 próbuje ponownie utworzyć moją bazę danych, mimo że model się nie zmienił?

 
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 

Nie mogę zrozumieć, dlaczego to działa czasami z istniejącego pliku .dbf i innych czasach narzeka. Próbowałem nawet jednoznacznie ustawić domyślne zachowanie z

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

Czy ktoś inny tego doświadczył?

  • Ponowne uruchomienie Cassini nie wydaje się mieć znaczenia.
  • Odsłonięcie w IE po otrzymaniu tego błędu spowoduje, że dokładnie ta sama strona zostanie załadowana poprawnie.
+0

ze swojego stacktrace: 'CreateDatabaseOnlyIfNotExists'. EF * próbuje * zrobić właściwą rzecz. Ale jakoś sprawdzić, czy DB istnieje nie powiodło się. Spójrz na to. –

+0

Oto dziwna rzecz. Ładowanie symboli/kodu ramek .NET i debugowanie kodu faktycznie zatrzymuje problem. Każdego razu. Nie rozumiem tego. – Jedidja

Odpowiedz

1

Zainstaluj i używaj programu SQL Server CE CTP1, który nadal można pobrać pod adresem Microsoft sites. To rozwiązało mój problem z tym.

3

Wygląda na to, że jest to niedawno odkryty błąd. MSDN Forum

Rozwiązaniem jest ponowne zainstalowanie programu SQL Server CE 4,0 CTP 1 download

8

Niestety wskrzesić taką starą pytanie, ale ja przeżywałam to dzisiaj i znaleźli obejście, które nie obejmują instalacji starszej wersja CTP.

z właściwego URL dla blogpost jest http://www.hanselman.com/blog/PDC10BuildingABlogWithMicrosoftUnnamedPackageOfWebLove.aspx (około pół drogi przez blogu)

* Idź do pliku AppStart_SQLCEEntityFramework.cs a linią DefaultConnectionFactory do tego: *

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

Moja konkretna baza danych jest umieszczona w folderze App_Data, ale zakładam, że jeśli twoja nie jest, powinieneś być w stanie zmienić ścieżkę, aby pasowała i będzie działać.

Mam nadzieję, że to pomoże!

+0

Wspaniały, który i tak pomógł mi. –

+0

Właśnie zrobiłem to dzisiaj z nowym wydaniem 4.1 EF ... :-) – klabranche

1

miałem ten sam problem dzisiaj z opublikowanego MVC3 i SQL Server CE 4,0 pobranego z Nuget i został rozwiązany przez odkomentowanie linię:

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

i zastąpienie MyContext z klasą kontekstowego, który został dziedziczy z DBContext w folder modeli.

Powiązane problemy