Asp.net mvc 为什么EF4试图重新创建我的数据库,即使模型没有改变?

Asp.net mvc 为什么EF4试图重新创建我的数据库,即使模型没有改变?,asp.net-mvc,entity-framework-4,asp.net-mvc-3,sql-server-ce-4,Asp.net Mvc,Entity Framework 4,Asp.net Mvc 3,Sql Server Ce 4,我有一个使用SQLServerCE4.0的ASP.NETMVC3beta网站。使用和我自己的代码,当我尝试访问数据库时,有时会出现以下异常: File already exists. Try using a different database name. [ File name = D:\Sourcecode\NerdDinner\NerdDinner\App_Data\NerdDinners.sdf ] Line 17: public ActionResult Index

我有一个使用SQLServerCE4.0的ASP.NETMVC3beta网站。使用和我自己的代码,当我尝试访问数据库时,有时会出现以下异常:

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<...>());
还有其他人经历过吗

重启卡西尼号似乎没有什么不同。 收到此错误后点击IE中的刷新将正确加载完全相同的页面。
安装并使用SQL Server CE CTP1,它仍然可以在上下载。这解决了我的问题。

看起来这是最近发现的一个bug。


解决方法是重新安装SQL Server CE 4.0 CTP 1。很抱歉,重新提出了这样一个老问题,但我今天遇到了这个问题,找到了一个不涉及安装旧版本CTP的解决方法

从博客文章的正确url开始大约是博客文章的一半

*进入AppStart_SQLCEEntityFramework.cs文件和DefaultConnectionFactory行,以执行以下操作:*

Database.DefaultConnectionFactory = new SqlCeConnectionFactory( 
    "System.Data.SqlServerCe.4.0", 
    HostingEnvironment.MapPath("~/App_Data/"),"");
我的特定数据库放在App_Data文件夹中,但我假设如果您的数据库不是,您应该能够更改路径以适应,并且它会工作


希望这有帮助

我今天在使用NuGet下载的MVC3和SQL Server CE 4.0版本中遇到了同样的问题,通过取消注释行解决了这个问题:

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

并将MyContext替换为从models文件夹中的DBContext继承的context类。

最终的SQL Compact Edition 4.0已发布,安装后不再出现问题。以下是团队博客上的公告:


从stacktrace中:CreateDatabaseOnlyIfNotExists。EF正在努力做正确的事情。但不知何故,检查数据库是否存在的检查失败了。看看吧,奇怪的是。加载.NET framework符号/代码并调试代码实际上可以阻止问题的发生。每一次。我不明白。太棒了,这帮了我的忙。今天刚刚发布了4.1版的EF…:-