问题 为什么EF4尝试重新创建我的数据库,即使模型没有改变?


我有一个使用SQL Server CE 4.0的ASP.NET MVC 3 Beta网站。既 ScottGu的NerdDinner例子 和我自己的代码,一旦我尝试访问数据库,我有时会得到以下异常:

文件已存在。尝试使用其他数据库名称。
[文件名= D:\ Sourcecode \ NerdDinner \ NerdDinner \ App_Data \ NerdDinners.sdf]

第17行:公共ActionResult索引()
第18行:{
第19行:var dinners =来自nerdDinners.Dinners中的d
第20行:其中d.EventDate> DateTime.Now
第21行:选择d;

[SqlCeException(0x80004005):文件已存在。尝试使用其他数据库名称。 [文件名= 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连接,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谓词)+63
   D:\ Sourcecode \ NerdDinner \ NerdDinner \ Controllers \ HomeController.cs中的NerdDinner.Controllers.HomeController.Index():19

我无法弄清楚为什么它有时会与现有的.dbf文件一起工作,有时会抱怨它。我甚至尝试使用显式设置默认行为

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

还有其他人经历过这个吗?

  • 重新启动Cassini似乎没有什么区别。
  • 在收到此错误后在IE中点击刷新将使正确相同的页面加载正确

1784
2017-10-07 14:57


起源

从您的堆栈跟踪: CreateDatabaseOnlyIfNotExists。 EF是 试 做正确的事。但不知何故检查数据库是否存在失败。看看那个。 - Craig Stuntz
这是奇怪的事情。加载.NET框架符号/代码并调试代码实际上可以防止问题发生。每次。我不明白。 - Jedidja


答案:


安装并使用仍可下载的SQL Server CE CTP1 微软网站。这解决了我的问题。


1
2017-10-12 10:44





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

来自博客帖子的正确网址是 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文件夹中,但我假设如果你不是,你应该能够改变适合的路径,它将起作用。

希望这可以帮助!


8
2017-12-20 12:21



太棒了,无论如何帮助了我。 - Johan Danforth
今天刚刚发布的新版本的EF ... :-) - klabranche


看起来这是最近发现的错误。 MSDN论坛

解决方法是重新安装SQL Server CE 4.0 CTP 1 下载


3
2017-10-15 22:09





我今天遇到了与使用NuGet下载的已发布的MVC3和SQL Server CE 4.0同样的问题,它通过取消注释该行来解决:

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

并使用继承自models文件夹中的DBContext的上下文类替换MyContext。


1
2018-02-25 21:36





最终的SQL Compact Edition 4.0已经推出,安装后问题就不再发生了。以下是团队博客的公告:

Microsoft SQL Server Compact 4.0可供下载


0
2018-04-03 15:13