问题 EntityFramework 6.0 CreateDatabaseIfNotExists代码首先创建数据库


我究竟做错了什么。我有一个用户DbContext设置和工作时,我最初使用powershell创建Code-First它一切正常。

我在应用程序启动时按预期实现了Database Initializer。

Database.SetInitializer<UserDbContext>(new CreateDatabaseIfNotExists<UserDbContext>());

只是为了测试它是否真的创建了数据库我实际上删除了数据库,现在我被困住了数据库将不会被创建。我正在使用SQL Server 2012,任何想法可能是错的。

我得到的错误信息是

System.InvalidOperationException: Migrations is enabled for context 'UserDbContext' but the database does not exist or contains no mapped tables. Use Migrations to create the database and its tables, for example by running the 'Update-Database' command from the Package Manager Console.

我从包管理器控制台尝试了相同的操作,它仍然给我相同的消息。


1360
2017-10-23 15:40


起源



答案:


终于找到了解决方案,不知道为什么或什么。将我的数据库初始化程序更改为MigrateDatabaseToLatestVersion而不是CreateDatabaseIfNotExists工作。

Database.SetInitializer<UserDbContext>(new MigrateDatabaseToLatestVersion<UserDbContext, Configuration>());

14
2017-10-23 17:07



我面临着创建数据库的相同问题。你把那条线放在哪里了? Configuration.cs文件 public Configuration() ?因为那是我放置它的地方,每次我跑的时候都会和2013年一起崩溃 update-database 命令。期待您的来信。 - Yustme
@Yustme,主题已经很老了,但是为了记录,你配置了 initializer 在里面 Context 构造函数。 - Akbari


答案:


终于找到了解决方案,不知道为什么或什么。将我的数据库初始化程序更改为MigrateDatabaseToLatestVersion而不是CreateDatabaseIfNotExists工作。

Database.SetInitializer<UserDbContext>(new MigrateDatabaseToLatestVersion<UserDbContext, Configuration>());

14
2017-10-23 17:07



我面临着创建数据库的相同问题。你把那条线放在哪里了? Configuration.cs文件 public Configuration() ?因为那是我放置它的地方,每次我跑的时候都会和2013年一起崩溃 update-database 命令。期待您的来信。 - Yustme
@Yustme,主题已经很老了,但是为了记录,你配置了 initializer 在里面 Context 构造函数。 - Akbari


编辑:  使用新的错误消息时,问题来自于您已启用迁移并已运行迁移(可能是第一次创建数据库),并且由于您删除了数据库,因此迁移历史记录已丢失。如果您没有使用自动迁移,则无法进入并自行更改数据库,并希望代码首先了解它。尝试禁用迁移并重新启用它们以查看是否清除了迁移历史记录。

您需要调用DB作为数据的读取或插入,以便最初创建数据库。您使用的代码只告诉EF如何在数据库尝试查找数据库时不存在该数据库。对我来说,我使用的是方法 http://www.codeproject.com/Tips/411288/Ensure-Your-Code-First-DB-is-Always-Initialized


2
2017-10-23 15:44



感谢您的答复。我试过,仍然无法正常工作。 - Sanj
奇怪它对我有用,请查看这个有关初始化数据库的不同方法的更多想法: stackoverflow.com/questions/12724320/... - Matthew
嗨鹰,我已经跟着你了,所以相应地得到了​​一切。您提到的我使用自动迁移和迁移历史记录保存在数据库本身内部吗?或者我在这里错过了一大片图片。理论上删除启用了自动迁移的数据库,数据库初始化规则应该重新创建数据库。还是没有运气...... - Sanj
迁移日期存储在数据库的特殊表中,因此当自动迁移运行时,它会查找该特殊表中的DB规范,并将其与新的dbcontext架构进行比较并应用任何更改。由于缺少该表,因此无需比较和失败,因为它期望数据库存在。你需要做的是manualy运行迁移0(阅读生成和运行迁移部分@ msdn.microsoft.com/en-us/data/jj591621.aspx)或禁用然后重新启用迁移 - Matthew