gpt4 book ai didi

c# - Entity Framework : am I supposed to modify migration classes?

转载 作者:可可西里 更新时间:2023-11-01 09:12:58 25 4
gpt4 key购买 nike

我希望我了解基本的工作流程。首先我创建一个模型,然后我生成一个初始迁移,然后我从中生成一个 SQL,好的。我更新了模型,我从中创建了一个新的迁移,并从中创建了一个新的 SQL,好的。

我假设这是一个单向的工作流程是否正确?如果我以错误的方式更改了迁移类,它将永远不会反射(reflect)在我的模型中,并且如果数据库架构不是它应该的样子,EF 永远不会注意到,我只会得到奇怪的异常,对吧?

如何确保在修改迁移类时不会导致不一致?我假设我只能做两件事:首先,添加 EF 不关心的新数据库对象,其次,以最终具有相同架构的方式更改 EF 生成的迁移代码(例如,如果 EF 生成一个drop columnadd column ,我可以将其更改为 rename column ) 和 Down()Up()方法必须一致,仅此而已吗?例如,我可以更改 EF 关心的架构吗?

最佳答案

注意:我将对使用 Add-Migration 创建的每个迁移调用“添加迁移” ,或由自动迁移自动创建

注意:当我说“DbContext 的状态”时,我的意思是首先在代码中完成模型的定义,即实体、它们的属性、关系和所有其他配置

注意:“由 DbContext 知道”是指 DbContext 知道的所有类型的数据库对象,例如映射到实体的表或 View 。 DB 中有很多其他 DbContext 不知道的东西,包括未映射到 DbContext 实体的表和 View

I hope I understand the basic workflow. First I create a model, then I generate an initial migration, and I generate an SQL from that, OK. I update the model, I create a new migration from that, and a new SQL from that, OK.



当然,您可以将数据库架构从一个添加的迁移更改为其他添加的迁移,无论是升级还是降级,或者中间有多少个添加的迁移。 IE。您可以指定源和目标迁移。

Am I correct in assuming that this is a one-way only workflow?



如果这意味着您只能应用从代码到数据库的迁移,是的,它只能从代码到数据库,而没有其他方式。

If I change the migration class in a bad way, it will not ever be reflected in my model,



你为什么要这样做?创建迁移只是为了完美地完成它而不会出错。为什么要手工呢?添加的迁移包括从先前添加的迁移的 DbContext 状态升级到当前 DbContext 状态的过程的定义。以及降级的过程,即返回到先前添加的迁移的 DbContext 状态。如果您在修改迁移时不小心,您可以打破这一点。

and if the database schema is not exactly what it should be, EF will never notice, and I will only get weird exceptions, right?



不!它与迁移无关。独立于迁移,当 DbContext 被实例化时,模型在内存中创建,并根据 DB 模式进行检查。如果不匹配,您将收到异常。但这与迁移无关。

您通常会修改模型、添加迁移并将迁移应用到 DB,以便 DbContext 和 DB 架构同步。其他选项是修改 DB 并使用 T4 模板对 DB 进行逆向工程并从 DB 架构中获取 DbContext。问题是两者都必须同步,但你如何做并不重要。

How to be sure that when I modify a migration class, I do not cause inconsistencies? I assume I can only do two things: first, add new database objects which EF doesn't care about, second, change EF-generated migration code in a way that it ends up with the same schema (for example, if EF generates a drop column and an add column, I can change that to a rename column), and the Down() and Up() methods have to be consistent, is that all? For example, can I ever change the schema that EF cares about?



不要混淆 DB 模式、DbContext 和迁移概念。

如上所述,DB 和 DbContext 必须同步。

迁移是实现这种同步的一种简单方法:您创建初始模型并添加第一个添加迁移。然后创建数据库。 DbContext 和 DB 模式完全同步。如果您以 DB 架构更改且与 DbContext 不匹配的方式修改迁移,会发生什么情况?您的 DbContext 和您的数据库架构将不同,并且在实例化 DbContext 时会引发异常。

但是,为什么数据库上有一个迁移表?

当您对数据库应用迁移时,数据库的架构会更新,并且 快照获取当前模式(更准确地说,是 DbContext“已知”的模式部分,而不是整个数据库模式),并存储在 Model 中。 __MigrationHistory的栏目数据库中的表。

迁移知道如何将数据库架构从“源”添加迁移更改为“目标”添加迁移。迁移历史表用于验证 DB 模式与上次应用的迁移是否一致。 IE。在应用新迁移之前,migrations 使用 验证当前数据库架构是否与应用上次迁移时的架构匹配。快照存储在迁移表中。如果不匹配,则该过程将失败。如果匹配,迁移将安全地将更改从“源”添加迁移应用到“目标”添加迁移,并存储 快照的结果模式。

那么,你怎么能打破东西呢?
  • 通过以与 DbContext 更改不一致的方式修改迁移代码(例如,在迁移中添加一个新列,而不是在 DbContext 实体中添加它)。
  • 通过以某种方式修改数据库,使数据库架构与应用上次迁移时拍摄的快照不同(因此,当您要应用新迁移时,真实架构和快照将不匹配,并且过程将失败)

  • 什么可以安全地完成?

    任何不会改变 DbContext“已知”的数据库架构的东西,即:
  • 添加代码中定义的 DbContext 不“知道”的对象(甚至是表)(当然还有触发器、存储过程、 View ...)
  • 添加或删除数据(表中的行),例如填充主表
  • 做任何其他不修改架构的事情(修改安全性、配置等)
  • 关于c# - Entity Framework : am I supposed to modify migration classes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23956965/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com