C# EF6尝试在运行时创建表,但没有挂起的更改
我正在为我的ASP.NET项目使用Entity Framework 6.1.3代码优先迁移。我已禁用自动迁移。我运行了C# EF6尝试在运行时创建表,但没有挂起的更改,c#,asp.net,.net,entity-framework,entity-framework-6,C#,Asp.net,.net,Entity Framework,Entity Framework 6,我正在为我的ASP.NET项目使用Entity Framework 6.1.3代码优先迁移。我已禁用自动迁移。我运行了addmigration和updatedatabase命令,EF在\uu MigrationHistory和DbContext之间找不到任何挂起的更改。但是,当我启动应用程序时,如果表已经存在于\u MigrationHistory表的最新条目中,它会尝试从上下文创建表。(为了确保这一点,我检查了migrations表中的EDMX XML文件)。你有什么想法吗?我如何在不丢失任何
addmigration
和updatedatabase
命令,EF在\uu MigrationHistory
和DbContext
之间找不到任何挂起的更改。但是,当我启动应用程序时,如果表已经存在于\u MigrationHistory
表的最新条目中,它会尝试从上下文创建表。(为了确保这一点,我检查了migrations表中的EDMX XML文件)。你有什么想法吗?我如何在不丢失任何数据的情况下解决这个问题?
如果不希望应用程序总是在运行时重新创建表,则必须更改数据库初始值设定项。在
DBContext
类中,您应该会看到类似这样的代码(假设您的DBContext
名为MyDbContext
):
static MyDbContext()
{
//你应该看看这个。。。
SetInitializer(新的DropCreateDatabaseAlways());
//…或者这个。。。
SetInitializer(新的DropCreateDatabaseIfModelChanges());
}
第一个初始值设定项将始终重新创建数据库,第二个初始值设定项仅在模型发生更改时重新创建数据库。如果未指定初始值设定项,则默认值为
CreateDatabaseIfNotExists
,顾名思义,如果数据库不存在,它将创建数据库。您也可以在配置文件中设置初始值设定项。有关更多示例和信息,请参阅。我在ModelCreating上的上下文中有这段代码方法数据库.SetInitializer(新的MigrateDatabaseToLatestVersion())代码>我应该删除它吗?这是您看到设置初始值设定项的唯一位置吗?运行对SetInitializer
的搜索,查看它是否在其他地方弹出。我在另一个DbContext
中有它,我需要它,因为对于该上下文,我启用了自动迁移(它是ASP.NET Identity Framework的上下文)。这不会扼杀我的自动迁移吗?如果我从那里删除它,EF不再尝试重新创建DB,但这是正确的方法吗?身份上下文的初始值设定项应该可以,我只是检查是否在ContextDbContext
上设置了第二个初始值设定项。如果您只是调试和处理个人项目,并且不介意每次运行时是否删除数据库,那么使用DropCreateDatabaseAlways
初始值设定项是最简单的。由于您已禁用自动迁移并且正在手动执行迁移,MigrateDatabaseToLatestVersion
不再有意义。如果删除标识上下文初始值设定项,它将默认为CreateDatabaseIfNotExists
,只有在数据库被擦除时才会创建表。现有用户表将不受影响。听起来您的迁移可能不同步。您可以找到试图创建“City”表的迁移,并注释掉现有表的所有代码,然后将其应用于更新数据库,或者您可以创建一个新的基线迁移(添加迁移InitialCreate–IgnoreChanges)。我在下面的注释中看到,您有一个单独的标识上下文。确保您的迁移目标是正确的上下文(-ContextTypeName),或者让您的应用程序上下文从IdentityDbContext继承。是的,我已经进行了双重和三重检查。问题是我没有在DbMigrationsConfiguration
中设置属性migrationnamespace
,这导致另一个DbContext
使用错误的迁移进行迁移。
static MyDbContext()
{
// You should see this...
Database.SetInitializer(new DropCreateDatabaseAlways<MyDbContext>());
// ... or this ...
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDbContext>());
}