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

时间:2010-10-07 14:57:43

标签: asp.net-mvc entity-framework-4 asp.net-mvc-3 sql-server-ce-4

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

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 个答案:

答案 0 :(得分: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文件夹中,但我假设如果你的数据库不是,你应该能够改变适合的路径,它会起作用。

希望这有帮助!

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

安装并使用SQL Server CE CTP1,它仍可在Microsoft sites下载。这解决了我的问题。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

Microsoft SQL Server Compact 4.0 is available for download