gpt4 book ai didi

entity-framework - 使用 Entity Framework 在单次迁移中更新列长度和数据

转载 作者:行者123 更新时间:2023-12-04 10:17:30 25 4
gpt4 key购买 nike

我将 Entity Framework 与代码优先迁移一起使用。我需要增加 VARCHAR(50) 的长度列到 VARCHAR(100)并通过将字符串加倍来更新该列中的所有记录。所以“abc”变成了“abcabc”(除了值将长于三个字符)。

能够在单个代码首次迁移中做到这一点会很好,但我无法让它工作。我首先尝试使用此代码:

AlterColumn("dbo.SomeTable", "SomeField", c => c.String(maxLength: 100, unicode: false));

using (TheEntityContext ctx = new TheEntityContext())
{
foreach (Entities.SomeTable st in ctx.SomeTables)
st.SomeField = st.SomeField + st.SomeField;

ctx.SaveChanges();
}

但我收到了这个错误:

The model backing the 'TheEntityContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).



我觉得这很奇怪。也许我不能在代码优先迁移中使用 Entity Framework ?所以我尝试了这个代码:
AlterColumn("dbo.SomeTable", "SomeField", c => c.String(maxLength: 100, unicode: false));

using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
string sql = "UPDATE SomeTable SET SomeField = SomeField + '' + SomeField";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
}

但我收到了这个错误:

String or binary data would be truncated.



然后我虽然是 ALTER TABLEUPDATE 之前使字段不再生效的声明语句运行?所以我改了 UDPDATE语句是一个 50 个字符的字符串,它运行良好。运行 Update-Database -Verbose还表明它没有运行 ALTER TABLE UPDATE之前的声明陈述。

那么这里有什么关系呢?我是否必须运行 ALTER TABLE在一次迁移中,然后在另一次迁移中更新表的代码?

最佳答案

关键是 EF 将迁移作为事务的一部分执行。

你在里面打开一个新的事务,这是没有必要的,只需使用

AlterColumn("dbo.SomeTable", "SomeField", c => c.String(maxLength: 100, unicode: false));

Sql("UPDATE dbo.SomeTable SET SomeField = '' + SomeField + SomeField");

在这种情况下, Sql()函数将在相同的事务上下文中运行,并且不应出现错误。

编辑 :澄清 Sql() 的事务上下文功能。

关于entity-framework - 使用 Entity Framework 在单次迁移中更新列长度和数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28640173/

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