gpt4 book ai didi

entity-framework - 生成的迁移已与架构匹配

转载 作者:行者123 更新时间:2023-12-01 03:35:17 25 4
gpt4 key购买 nike

我有一个类似的类(class)

public class Foo
{
public virtual string Bar { get; set; }
// Other Stuff
}

现在需要治疗 Bar像一个 CHAR(8) 所以我修改了属性
    [StringLength(8)]
[Column(TypeName = "char")]
public virtual string Bar { get; set; }

项目中有很多迁移,通常是向现有类添加新类或新属性。我知道我可以生成一个更改列类型的新迁移,但最初将列创建为 NVARCHAR(Max) 然后将其更改为 CHAR(8) 似乎有点复杂。我编辑了初始迁移,更改
CreateTable(
"dbo.Foo",
c => new
{
Bar = c.String(),
// Other stuff
})


CreateTable(
"dbo.Foo",
c => new
{
Bar = c.String(maxLength: 8, fixedLength: true, storeType: "char", unicode: false),
// Other stuff
})

然后我删除了数据库并运行了一个使用上下文的程序,从而重新创建了数据库。

我在初始迁移和最后一次迁移结束时设置了一个断点。初始迁移完成后,表 Foo 将在新重新创建的数据库中创建,其列类型为 CHAR(8)。在最终迁移完成并尝试使用上下文后,我得到一个 AutomaticMigrationsDisabledException .

然后我编写了一个迁移脚本来查看 EF 的不同之处,然后得到
public override void Up()
{
AlterColumn("dbo.Foo", "Bar", c => c.String(maxLength: 8, fixedLength: true, unicode: false));
}

public override void Down()
{
AlterColumn("dbo.Foo", "Bar", c => c.String());
}

Up() 迁移正在执行创建表时已经完成的操作(并在物理上与模式匹配),而 Down() 迁移想要将列更改回 NVARCHAR(Max),这是它从未做过的。

问题

为什么 EF 会尝试执行这种看似不必要的迁移,我是否可以在不首先创建 NVARCHAR(Max) 然后在新的单独迁移中将其更改为 CHAR(8) 的情况下更改列类型?

最佳答案

This link描述迁移过程的内部结构。这里的问题与嵌入在资源文件中的比较模型有关,以便在创建时生成迁移。如果您更改 Up() Down() 代码,您可能会影响生成的脚本,但不会影响初始比较模型。

不建议更改这些模型,尽管这 link展示了如何检查它。建议的解决方法是创建一个新的迁移,以便将模型插入到其资源文件中。使用 -IgnoreChanges 标志创建仅包含模型更新的空白迁移。见 https://msdn.microsoft.com/en-us/data/dn579398.aspx?f=255&MSPPError=-2147217396#option1

关于entity-framework - 生成的迁移已与架构匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35446612/

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