Почему EF4 пытается воссоздать мою базу данных, даже если модель не изменилась? - PullRequest
11 голосов
/ 07 октября 2010

У меня есть веб-сайт ASP.NET MVC 3 Beta, использующий SQL Server CE 4.0.И с примером ScottGu NerdDinner и с моим собственным кодом, я иногда получаю следующее исключение, как только я пытаюсь получить доступ к базе данных:

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

Я не могу понять, почему это иногда работаетс существующим файлом .dbf и в других случаях он жалуется.Я даже пытался явно установить поведение по умолчанию с помощью

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

Кто-нибудь еще испытывал это?

  • Перезапуск Cassini, похоже, не имеет значения.
  • Нажатие на обновление в IE после получения этой ошибки приведет к правильной загрузке точно такой же страницы .

Ответы [ 5 ]

8 голосов
/ 20 декабря 2010

Извините, что воскресил такой старый вопрос, но я столкнулся с этим сегодня и нашел обходной путь, который не предусматривает установку более старой версии CTP.

Из правильного URL для поста блога: http://www.hanselman.com/blog/PDC10BuildingABlogWithMicrosoftUnnamedPackageOfWebLove.aspx (примерно на полпути к сообщению в блоге)

* Перейдите в файл AppStart_SQLCEEntityFramework.cs и строку DefaultConnectionFactory по этому адресу: *

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

Моя конкретная база данных находится в папке App_Data, но я предполагаю, что если у вас ее нет, вы сможете изменить путь, чтобы она подходила, и она будет работать.

Надеюсь, это поможет!

3 голосов
/ 16 октября 2010

Похоже, что это недавно обнаруженная ошибка. MSDN Forum

Временное решение: переустановить SQL Server CE 4.0 CTP 1 загрузить

1 голос
/ 26 февраля 2011

У меня была такая же проблема сегодня с выпущенными MVC3 и SQL Server CE 4.0, загруженными с NuGet, и она была решена путем раскомментирования строки:

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

И замены MyContext классом контекста, который наследовал от DBContextв папке моделей.

1 голос
/ 12 октября 2010

Установите и используйте SQL Server CE CTP1, который все еще можно загрузить на сайтах Microsoft .Это решило мою проблему с этим.

0 голосов
/ 03 апреля 2011

Выпущена финальная версия SQL Compact Edition 4.0, и после ее установки проблема больше не возникает. Вот объявление из блога команды:

Microsoft SQL Server Compact 4.0 доступен для скачивания

...