Ответ 1
Установите и используйте SQL Server CE CTP1, который по-прежнему можно загрузить на сайтах Microsoft. Это решило мою проблему.
У меня есть веб-сайт 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<...>());
Кто-нибудь еще испытал это?
Установите и используйте SQL Server CE CTP1, который по-прежнему можно загрузить на сайтах Microsoft. Это решило мою проблему.
Извините, что воскресил такой старый вопрос, но я испытал это сегодня и нашел обходное решение, которое не связано с установкой более старой версии CTP.
От правильного URL-адреса для blogpost 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, но я предполагаю, что если ваш нет, вы должны быть в состоянии изменить путь, который подходит, и он будет работать.
Надеюсь, это поможет!
Похоже, что это недавно обнаруженная ошибка. Форум MSDN
Обходной путь заключается в переустановке SQL Server CE 4.0 CTP 1 download
У меня была та же проблема сегодня с выпущенными MVC3 и SQL Server CE 4.0, загруженными с NuGet, и она была решена путем раскомментации строки:
DbDatabase.SetInitializer(new CreateCeDatabaseIfNotExists<MyContext>());
И заменив MyContext классом контекста, который наследуется от DBContext в папке моделей.
Последняя версия SQL Compact Edition 4.0 отсутствует, и после ее установки проблема больше не возникает. Вот объявление из блога команды: