代码之家  ›  专栏  ›  技术社区  ›  Jedidja

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

  •  11
  • Jedidja  · 技术社区  · 15 年前

    我有一个使用SQL Server CE4.0的ASP.NET MVC 3测试版网站。两者兼有 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<...>());
    

    有其他人经历过吗?

    • 重启卡西尼似乎没有什么不同。
    • 收到此错误后在IE中单击“刷新”将使完全相同的页面正确加载。 .
    5 回复  |  直到 15 年前
        1
  •  1
  •   zigomir    15 年前

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

        2
  •  8
  •   gyurisc    15 年前

    很抱歉再次提出这样一个旧问题,但我今天遇到了这个问题,并且找到了一个解决办法,不涉及安装旧版本的CTP。

    从blogpost的正确URL 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文件夹中,但我假设如果你的数据库不是,你应该能够更改路径以适应它,它将工作。

    希望这有帮助!

        3
  •  3
  •   Dave    15 年前

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

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

        4
  •  1
  •   Case    15 年前

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

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

    并将MyContext替换为从Models文件夹中的dbContext继承的上下文类。

        5
  •  0
  •   gyurisc    15 年前

    最终的SQL Compact版本4.0已经过时,安装后问题不再出现。以下是来自团队博客的公告:

    Microsoft SQL Server Compact 4.0 is available for download