Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF6尝试在运行时创建表,但没有挂起的更改_C#_Asp.net_.net_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# EF6尝试在运行时创建表,但没有挂起的更改

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文件)。你有什么想法吗?我如何在不丢失任何

我正在为我的ASP.NET项目使用Entity Framework 6.1.3代码优先迁移。我已禁用自动迁移。我运行了
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>());
}