问题标签 [entity-framework-migrations]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
953 浏览

azure - SQL Azure 意外的数据库删除/重新创建

几个小时以来,我一直在摸不着头脑,但似乎无法弄清楚出了什么问题。


这是我们的项目基本设置:

  • 具有 ASP.NET 成员资格的 MVC 3.0 项目
  • 实体框架 4.3,代码优先方法
  • 本地环境:带有 2 个 MDF 数据库文件的本地 SQL Server(aspnet.mdf + entity.mdf)
  • 服务器环境:Windows Azure + 2 个 SQL Azure 数据库(aspnet 和实体)


这是我们所做的:

  • 创建本地和远程数据库,修改 web.config 以在调试模式下使用 SQLEXPRESS 连接字符串,在发布模式下使用 SQL Azure 连接字符串
  • 创建了一个类,该类使用种子数据的方法进行SampleData扩展。DropCreateDatabaseAlways<Entities>Seed
  • 用于将数据播种System.Data.Entity.Database.SetInitializer(new Models.SampleData());Application_Start我们的数据库中。
  • 在本地运行应用程序 - 表已创建并播种,一切正常。
  • 部署,运行远程应用程序 - 表已创建并播种,一切正常。
  • 添加了预处理器指令,以在我们的远程 Azure 环境中的每个应用程序启动时停止破坏实体数据库:

    /li>


这就是它变得丑陋的地方

  • 我们使用 NuGet 启用了迁移,使用AutomaticMigrationsEnabled = true;
  • 一切都运行顺利,很好。我们让它煮了几天
  • 今天,我们注意到 Azure 环境中的一个未知错误:

    • 我们有几个派生自超类的类SuperClass
    • 相应的实体表将所有这些对象存储在同一个SuperClass表中,使用鉴别器来知道在加载各种类时从哪一列提供数据
    • 虽然在今天之前加载还不错,但现在不行了。我们收到以下错误消息:

      /li>
    • 快速检查后,我们的SuperClass表有列FooFoo1。足够合乎逻辑,因为SuperClass有 2 个子类SubClass1SubClass2,每个子类都有一个Foo属性。在我们的例子中,Foo是 NULL 但Foo1有一个int32值。所以问题不在于数据库——相反,我们的模型和数据库之间的链接似乎已经丢失。鉴别器逻辑已损坏。
  • 试图找出可能出了什么问题的迹象,我们注意到了几件事:

    • 尽管我们从未对 SQL Azure Entity 数据库执行任何迁移,但该数据库现在有一个_MigrationHistory
    • _MigrationHistory表有一条记录:

      /li>
    • 查看其他表,当迁移发生时,它们中的大多数都被清空了。只有最初播种的表SampleData保持不变。

    • 使用 SQL Azure 管理门户签入,我们的实体数据库显示以下创建日期:2012 年 4 月 10 日 23:50:55。


这是我们的理解

  • 出于某种原因,SQL Azure 删除并重新创建了我们的数据库
  • _MigrationHistory 表是在此过程中创建的,它注册了一个起点来测试模型以供将来迁移


这是我们的问题

  • 谁/什么触发了数据库删除/重新创建?
  • Application_Start自从has以来,EF 如何重新播种我们的样本数据System.Data.Entity.Database.SetInitializer<Entities>(null);

编辑:看看可能出了什么问题,我们注意到在这个 SQL Azure教程中我们不尊重的一件事:我们没有PersistSecurityInfo在创建数据库后从我们的 SQL Azure 实体数据库连接字符串中删除。不明白为什么在地球上它可能会导致问题,但仍然值得一提......

0 投票
4 回答
1043 浏览

asp.net-mvc - 外键约束,带有子对象集合的 EF

我正在尝试更新模型,但收到错误“操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性设置为空值,如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,否则必须删除不相关的对象。”

据我了解,关系无法改变,因为一个或多个外键属性不可为空,问题可能出在实体框架如何处理我的虚拟 ICollection

但是,我不确定在使用脚手架存储库模式时如何实现该解决方案。我是否必须编辑 Save() 方法 ParentObjectRepository 类?

其实我真的认为一定有办法让EF理解这一点。我看不出 EF 团队是如何思考“可能没有人使用具有外键约束的对象集合,我们不支持”。

更新 添加的代码

更多代码:

Save() 方法来自 MagnetEventRepository,它是由上述类构建的。

另一个更新 我通过将 AttendeeInformationField 中的 MagnetEventId 更改为可为空的 int 成功消除了错误。在检查数据库时,我可以确切地看到问题所在。

假设我有一个值为“E-mail”的 AttendeeInformationField。当我编辑我的 MagnetEvent 时,AttendeeInformationField 将 MagnetEventId 更新为 null,然后添加具有正确 MagnetEventId 和值的新帖子。

如果更新了 AttendeeInformationField 中的帖子,我会非常喜欢。

0 投票
3 回答
9741 浏览

.net - 在不同的 TFS 分支上工作时丢失 EF 代码优先迁移?

我们正在使用 TFS,并且我们的 Dev 有不同的分支。

  1. 在分支 A 中,我们进行了迁移以更改列大小

  2. 在分支 B 中,我们进行了迁移以添加新表。这个分支不知道分支A的修改!!

  3. 两个修改都合并到主分支。

当我更新数据库时,它会进行 2 次迁移,但最后告诉我有待处理的更改。如果我进行添加迁移,它会创建与第一次迁移相同的内容(在分支 A 中)。

无法更新数据库以匹配当前模型,因为存在待处理的更改并且自动迁移已禁用。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。您可以使用 Add-Migration 命令将挂起的模型更改写入基于代码的迁移。

是否因为我上次迁移的属性 Target de IMigrationMetadata 的内容中缺少某些内容,因为它不知道第一次迁移?

是否可以在不同的 TFS 分支中处理迁移?

0 投票
1 回答
215 浏览

c# - How to Downgrade/Upgrade multiple columns in multiple tables

I am able to Upgrade/downgrade recent changes in my database by using below commands

For Upgrade : In Package Manager Console used below command

For Downgrade : In Package Manager Console used below command

Can any one help how to Upgrade/Downgrade multiple columns in multiple tables.

0 投票
2 回答
453 浏览

entity-framework-4 - 使用实体框架迁移播种和分支项目

我正在使用实体框架代码首先使用迁移 4.3 进行项目。在本地运行时,我的 web.config 配置为以数据库初始化器为目标,该初始化器实现CreateDatabaseIfNotExists<DataContext>了用测试数据为我的开发数据库提供种子,但还在第一次运行时填充各种“静态”可查找数据。

创建开发数据库后,对数据库的任何后续更改都已完成,将迁移添加到项目并使用“updata-database”PS 命令更新数据库。

当我对项目感到满意时,我使用 webdeploy 部署代码,但手动复制数据库,因为 webdeploy 不包含迁移表。部署时,我使用 web.config 转换来设置一个新的数据库初始化程序,该初始化程序实现MigrateDatabaseToLatestVersion<DataContext>. 然后,这将应用之后部署的新的基于代码的迁移。这一切都运行良好,但我担心这是否是初始化我的数据库的最佳方法,不仅使用测试数据而且还使用运行应用程序所需的数据。我正在寻找的是一种创建初始种子数据的好方法,而无需将其挂接到迁移中CreateDatabaseIfNotExists<DataContext>,而是将其挂接到迁移中。我意识到配置类上有一个种子方法,但是看到它在每次迁移时都更新数据库,这不是理想的解决方案。

该项目在 TFS 中,有时我需要创建该项目的一个新分支,它本质上是第一个的克隆。第一次在本地运行时,数据库尚不存在,但将如前所述创建和播种。现在最大的问题是,以前通过迁移处理的模式更改现在将在第一次创建数据库时应用。如果我然后尝试添加一个新的迁移文件并运行“更新数据库”,我会碰壁,因为它无法运行以前的迁移,因为在创建数据库时已经应用了这些更改。我只能想象我在这里做错了什么,或者只是错过了一个技巧。

总之,我正在寻找有关

  1. 首次使用迁移创建数据库时,播种初始测试数据和所需应用程序数据的最佳方式。
  2. 分支包含代码迁移的项目并且必须第一次创建数据库时克服问题的最佳方法。

谢谢阅读。

0 投票
2 回答
2578 浏览

entity-framework-4 - Entity Framework 4.3.1 Code First:创建了数据库但没有创建表

今天我将一个旧应用程序从 EF 4.2 迁移到 EF 4.3.1。在我的应用程序中,我使用的是 CodeFirst,但在迁移后它停止工作,并且找不到原因。为了清除任何其他可能的问题,我决定创建一个小型控制台应用程序,并使用 ADO 团队发布的数据迁移演练:

http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx

我完全复制了博客的代码,但是我得到了一些错误,而不是正常工作(创建数据库、创建模式和插入博客):

  • 仅创建数据库,但不创建表
  • 我收到此错误Conversion failed when converting datetime from character string.

所有这些都在 SQL Server 2005 express 上。

我使用 SQL Compact 尝试了相同的方法,但结果相同(但错误不同):

  • 仅创建数据库(在本例中为 bin 文件夹中的 sdf 文件),但没有表
  • 我得到错误The format of the specified date or time datepart is not valid. [ String = 2012-04-19T13.21.04.364 ]

我认为在这两种情况下,问题都在于 EF 希望作为第一次迁移进入的行:

显然格式与 . 是错误的,至少在我的语言环境中,它应该是:

这是一个错误还是什么?它以前总是与其他日期时间一起工作。

更新 我尝试将它作为显式迁移运行,并使用 -verbose 标志集应用迁移,这就是我得到的:

更新 2 我安装了 SQL Server Profiler,并分析了那里发生的事情。我通过查询分析器一一执行了所有语句,而失败的是,如上所述,插入迁移。

当将数据时间字符串的格式从2012-04-23T14.16.59.038Z更改2012-04-23T14:16:59.038Z为命令时,我猜 EF 以与我的语言环境不兼容的格式发送数据时间。

谢谢西蒙妮

0 投票
2 回答
35055 浏览

c# - 如何在 EF 4.3 中使用带有复杂键的 AddOrUpdate 播种数据

我正在尝试使用一些测试数据为开发数据库播种。

我已经使用context.People.AddOrUpdate(p => p.Id, people));了很多成功。

我有另一个需要播种的表,其中我不知道主键。

例如,我想根据名字和姓氏匹配来添加或更新。

我不确定如何正确编写表达式。

显然是不正确的,但我希望它传达了我正在寻找的解决方案。

0 投票
2 回答
1087 浏览

database-migration - EF 4.3 Database Migrations - Is there a way to ignore errors?

Is there a way to ignore errors when running a manual migration?

We have client databases in different states and I need to get them all updated to the latest version.

The reason I ask about ignoring errors is because I just want to code my migration like this

but naturally and expectedly it will throw an exception where the column already exists.

0 投票
2 回答
34087 浏览

entity-framework - MVC3 和 Code First 迁移 - “自从创建数据库以来,支持‘blah’上下文的模型已经改变”

我首先使用实体​​框架代码开始了我的项目。当我准备好时,我将我的数据库和代码上传到我的主机提供商。一切正常。

我需要在我的一个类中添加一个新字段,并且我不想丢失数据库中的数据。因此,我尝试关注一些关于使用 Code First 迁移的博客文章。我做了以下事情:

  1. 我备份了我的远程(生产)数据库。
  2. 我在本地附加了这个数据库
  3. 我将该属性添加到我的班级
  4. PM> 启用迁移
  5. PM> Add-Migration AddSortOrderToCar
  6. PM>更新-数据库
  7. 此时,我创建了一个本地数据库的 .bak 文件,然后使用该文件“恢复”到远程数据库。
  8. 最后,我将代码发布到远程站点。

当我访问该站点时,我收到以下错误消息:支持“blahblah”上下文的模型自创建数据库以来已更改。考虑使用 Code First 迁移来更新数据库。

我究竟做错了什么?

0 投票
1 回答
1744 浏览

entity-framework - EF CodeFirst - 在数据库创建后创建索引

我正在将我的项目从数据库优先迁移到代码优先。

Entity Framework 做了一些很好的工作来创建我的新数据库(应该模仿旧的)。
我结合使用数据注释和流畅的 API 来描述我的表格。

我的数据库有一些索引,我也希望 Entity Framework 来创建它们。执行此操作的旧方法似乎是定义您自己的初始化程序并使用自定义 T-SQL。

但是现在我们有了 EF 迁移,这样做应该会更容易。
我似乎无法弄清楚如何将 CreateDatabaseIfNotExists<> 与自动迁移相结合来创建索引。我尝试使用 MigrateDatabaseToLatestVersion<,> 但在创建数据库后似乎没有执行迁移。

既然我们拥有 Entity Framework 4.3,那么在创建数据库时创建索引和约束的正确方法是什么?