如何避免使用自动 Code First 迁移重新创建现有数据库

2023-12-01

我正在使用 EF6,并且遇到数据库自动迁移问题。数据库存在,并且数据库中没有架构或数据更改。但由于某种奇怪的原因,应用程序似乎试图在机器重新启动时在数据库中重新创建现有表。并因此导致错误。我的问题是:

  1. 为什么在没有数据库架构更改的情况下会自动进行数据库迁移?是什么触发了它?
  2. 如何修复它。

我使用 Include 方法来加载这样的实体,当我调用它时出现错误:

using (var context = new MyDataContext())
{
    return context.Students.Include("Courses");
}

In the Student我的类有这个导航属性:

public class Student
{    
...

   public virtual ICollection<Course> Courses { get; set; } 
}

在Configuration.cs中:

public Configuration()
{
   this.AutomaticMigrationsEnabled = true;
   this.AutomaticMigrationDataLossAllowed = true;
}
...

我还设置了自动数据库迁移MyDataContext像这样的类:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDataContext, MyProject.DataModel.Migrations.Configuration>());

目前的问题是,99% 的情况下,一切正常,但由于某种未知的原因,会出现以下错误:

System.Data.SqlClient.SqlException(0x80131904):数据库中已有一个名为“Courses”的对象。 在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection,操作1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 包裹CloseInAction) 在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔callerHasConnectionLock,布尔asyncClose) 在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSetbulkCopyHandler,TdsParserStateObject stateObj,Boolean&dataReady) 在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串方法名称,布尔异步,Int32 超时,布尔 asyncWrite) 在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource)1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext1 c) 在 System.Data.Entity.Infrastruct.Interception.InternalDispatcher1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func3. 操作、TInterceptionContext拦截上下文、Action3 executing, Action3 执行) 在System.Data.Entity.Infrastruct.Interception.DbCommandDispatcher.NonQuery(DbCommand命令,DbCommandInterceptionContext拦截Context) 在 System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery() 在System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction事务,MigrationStatement迁移语句,DbInterceptionContext拦截Context) 在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1个migrationStatements、DbConnection连接) 在 System.Data.Entity.Migrations.DbMigrator.c__DisplayClass30.b__2e() 在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.c__DisplayClass1.b__0() 在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func1 operation) at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1个migrationStatements、DbTransaction(现有事务) 在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable1 操作,IEnumerable1 systemOperations, Boolean downgrading, Boolean auto) at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading) at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration) at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable1个pendingMigrations,字符串targetMigrationId,字符串lastMigrationId) 在 System.Data.Entity.Migrations.DbMigrator.UpdateInternal(字符串 targetMigration) 在 System.Data.Entity.Migrations.DbMigrator.c__DisplayClassc.b__b() 在 System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(操作必须成功保持数据库) 在 System.Data.Entity.Migrations.DbMigrator.Update(字符串 targetMigration) 在 System.Data.Entity.MigrateDatabaseToLatestVersion2.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf1.b__e() 在 System.Data.Entity.Internal.InternalContext.PerformInitializationAction(操作操作) 在 System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() 在 System.Data.Entity.Internal.LazyInternalContext.b__4(InternalContext c) 在 System.Data.Entity.Internal.RetryAction1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1 个动作) 在 System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() 在 System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(类型实体类型) 在 System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1.包含(字符串路径) 在 System.Data.Entity.Infrastruct.DbQuery`1.Include(字符串路径)

任何帮助表示赞赏! 谢谢你!!


如果您正在使用现有数据库,我建议您检查此页面:使用现有数据库进行 Code First 迁移。您将看到在对模型进行任何更改之前必须先执行以下两个步骤:

  1. Run the Add-Migration InitialCreate –IgnoreChanges命令输入 包管理器控制台。这将创建一个空迁移 当前模型作为快照。
  2. Run the Update-Database包管理器控制台中的命令。这 会将 InitialCreate 迁移应用到数据库。自从 实际的迁移不包含任何更改,它只是添加一个 行到__MigrationHistory表表明此迁移 已经被应用了。

当您使用自动迁移运行应用程序时,如果它正在执行任何类型的数据初始化,它将检查__MigrationHistory查看数据库是否需要更新,如果没有__MigrationHistory表(现有数据库中不会存在),则不会通过自动迁移针对数据库验证模型。因此,您需要将该表放入现有数据库中。为此,您需要按照我上面描述的步骤操作。当你跑步时Update-Database命令它将执行Up初始迁移时的方法,对数据库没有影响。并且它将创建__MigrationHistory基于模型当前状态的数据库中的表。这样,如果您使用自动迁移,下次 Code First 进行数据库初始化时,它会将当前模型与存储在__MigrationHistory以确定数据库是否需要迁移/更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免使用自动 Code First 迁移重新创建现有数据库 的相关文章

  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 使用 C# 读取 Soap 消息

  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且

随机推荐

  • phpmyadmin mysql 触发器语法错误

    我正在尝试编写一个 mySQL tigger 但我无法将代码放入 phpMyAdmin MySQL 中而不出现语法错误 有人能帮助我吗 Tables 我的触发器 CREATE TRIGGER after jeu insert ON jeu
  • 如何在 AS3 中完全删除影片剪辑

    我希望删除 mc 及其所有计时器 事件 有没有简单的方法可以做到这一点 当然 取消注册其计时器和事件 将其从其父级中删除 并删除对它的所有引用 也就是说 AS3是一种垃圾收集语言 因此您无法控制对象 包括MC 何时被really从记忆中删除
  • Google Sheets:如何触发随机函数? [复制]

    这个问题在这里已经有答案了 我在 Google 上有一张工作表 并一直在寻找如何使随机化脚本仅在需要时才工作的解决方案 而不是每次打开工作表或刷新它时 这是例子 让我们把工作表看成这样 B5单元有以下代码 index B1 B3 randb
  • 如何修复图像裁剪的放大尺寸?

    我想修复图像裁剪的缩放尺寸 如何做到这一点 我找到了很多并尝试了很多 但仍然无法获得正确的解决方案 裁剪的图像放大太多并变得模糊 请有人帮助我我的这个问题 我的代码是 intent putExtra crop true intent put
  • 电子邮件: Intent.ACTION_SEND 返回值是什么?

    当我启动时 startActivity new Intent Intent ACTION SEND 用于发送电子邮件 这是我可以在中测试的返回值 onActivityResult 因为 例如 如果用户单击 su 取消 退出电子邮件客户端 我
  • 读取文件并通过管道将其发送到父进程的程序

    我需要编写一个程序 创建从命令行向子进程发送文件名的管道 在子进程中读取该文件并使用管道将其发送回 父进程应该打印该文件 如果子进程中发生错误 则必须将错误发送到父进程 这是我的代码 它沿着文件文件打印一些垃圾 并且当我运行它时 它还禁用终
  • 编译Python代码和C++代码一样快吗?

    如果我用 Python 编写一个程序 然后使用以下任何编译器对其进行编译 Gordon McMillan 的安装程序 跨平台 Thomas Heller 的 py2exe Windows Anthony Tuininga 的 cx Free
  • 比较两个字符串数组而不通过每个元素进行索引的最佳方法是什么?

    是否有任何有效的方法可以用于比较两个字符串数组而无需检查每个元素 我尝试使用数组列表 构建对象 但没有一个没有显示出太大的效果 最后 要比较两个字符串 序列 表示字符序列 没有任何提高效率的技巧 你必须somehow遍历两个序列并逐个元素进
  • jQuery 根据文本更改表格单元格文本颜色

    我有一个表 其中包含包含状态的数据列 两个示例状态为 已拒绝 和 已付款 我想要做的是将 已拒绝 的文本颜色更改为红色 将 已付费 的颜色更改为绿色 对于具有此状态的单元格 我向td like td class status Html Di
  • TextView 的 Android 自定义属性[重复]

    这个问题在这里已经有答案了 可能的重复 如何读取Android中的自定义属性 最近我读到了有关自定义属性的内容 我想向 TextView 添加自定义属性 到目前为止我有 属性文件
  • 如何在 C++ 中声明和初始化 2d int 向量?

    我正在尝试做类似的事情 include
  • 笑话:如何模拟类的一个特定方法

    假设我有以下课程 export default class Person constructor first last this first first this last last sayMyName console log this f
  • Swift 5.5 AttributedString 不显示在界面中

    下面是 Swift 5 5 制作属性字符串的方法 let s Hello var attrib AttributedString s if let range attrib range of ell attrib range foregro
  • MongoDB 插入无重复项

    现在我正在运行 mongodb 我刚刚意识到 我正在插入集合 但我不确定是否可以防止重复 这是我插入的方式 function insertCompanies companyID companyURL companyAppID MongoCl
  • 带有 TabBar 的基于导航的应用程序

    我有一个基于导航的应用程序 它显示一个 TableView 您可以在其中选择一个单元格 然后它会将您带到该单元格的 详细信息视图 我希望这个视图有一个 TabBar 我可以在其中在 3 个子视图之间进行选择 我在网上找到了几个解决方案 但没
  • 如何避免在拖动具有可点击内容的 gridster.js 小部件后触发点击事件?

    我正在使用 Gridster http gridster net 能够将内容拖动到li 在我的li有一个可点击的div li a href div content div a li 所以这是我面临的问题 当我停止并释放拖动时 它将调用 di
  • 如何迭代 JSON 属性而不知道它是否是数组?

    我遇到这样的问题 API 使用 DEPARTURESEGMENT 响应我 有时仅包含一个对象 有时包含一组对象 根据具体情况 我的 foreach 循环似乎需要不同的逻辑 回应A getdeparturesresult departures
  • 原则 2 限制与 DQL 的关联

    Doctrine 2 1 中似乎存在一个疏忽 即返回子集并不容易 为协会收集 http www doctrine project org docs orm 2 1 en reference limitations and known iss
  • 如何从超类创建子类的实例?

    我正在创建一个类及其子类 其中需要调用父类的静态方法以返回子实例 class Animal static findOne this has to return either an instance of Human or an instan
  • 如何避免使用自动 Code First 迁移重新创建现有数据库

    我正在使用 EF6 并且遇到数据库自动迁移问题 数据库存在 并且数据库中没有架构或数据更改 但由于某种奇怪的原因 应用程序似乎试图在机器重新启动时在数据库中重新创建现有表 并因此导致错误 我的问题是 为什么在没有数据库架构更改的情况下会自动