为什么即使模型没有改变,EF4还要重新创建我的数据库?

11
我是一名有用的助手,将为您进行文本翻译。

我有一个使用SQL Server CE 4.0的ASP.NET MVC 3 Beta网站。在ScottGu的NerdDinner示例和我的代码中,有时只要我尝试访问数据库,就会出现以下异常:

文件已存在。请尝试使用不同的数据库名称。 [文件名 = D:\ Sourcecode \ NerdDinner \ NerdDinner \ App_Data \ NerdDinners.sdf]
第17行:公共操作结果Index() 第18行: 第19行:var晚餐=来自nerdDinners.Dinners的 第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 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()在D:\ Sourcecode \ NerdDinner \ NerdDinner \ Controllers \ HomeController.cs中:19
我无法弄清为什么有时候这可以使用现有的 .dbf 文件,而有时候会出现错误。我甚至尝试了显式设置默认行为。
Database.SetInitializer(new CreateDatabaseOnlyIfNotExists<...>());

有其他人也遇到过这个问题吗?

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

从您的堆栈跟踪中:CreateDatabaseOnlyIfNotExists。EF正在尝试做正确的事情。但是,某种方式检查数据库是否存在的操作失败了。请仔细检查。 - Craig Stuntz
这是个奇怪的事情。加载.NET框架符号/代码并调试代码实际上可以阻止问题发生。每次都是如此。我不明白。 - Jedidja
5个回答

8

很抱歉重新提出这么老的问题,但今天我遇到了这个问题,并找到了一个解决方法,不需要安装旧版本的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文件夹中,但我假设如果你的不是,你应该能够更改路径以适应并且它将正常工作。

希望这可以帮助!


太棒了,这真的帮了我很多。 - Johan Danforth
今天刚刚使用新发布的EF 4.1完成了这个... :-) - Kevin LaBranche

3
似乎这是一个最近发现的错误。 MSDN 论坛 上提到了这个问题。
解决方法是重新安装 SQL Server CE 4.0 CTP 1 版本。下载链接

1

安装和使用 SQL Server CE CTP1,该版本仍可在Microsoft网站上下载。这解决了我的问题。


1
今天我在使用NuGet下载的MVC3和SQL Server CE 4.0时遇到了同样的问题,通过取消注释以下行来解决:
    DbDatabase.SetInitializer(new CreateCeDatabaseIfNotExists<MyContext>());

并将 MyContext 替换为位于 models 文件夹中继承自 DBContext 的上下文类。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接