我使用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();
}
但是我收到了这个错误:
我认为这很怪异。也许我不能在代码首次迁移中使用Entity Framework?所以我尝试了这段代码:支持' TheEntityContext'从那时起,情境就发生 数据库已创建。考虑使用Code First Migrations 更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。
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();
}
但是我收到了这个错误:
字符串或二进制数据将被截断。
然后,我是ALTER TABLE
语句,以使字段在UPDATE
语句运行之前更长时间没有生效?所以我将UDPDATE
语句更改为50个字符的字符串,运行正常。运行Update-Database -Verbose
也表示它未在ALTER TABLE
语句之前运行UPDATE
语句。
那么这笔交易是什么?我是否必须在一次迁移中运行ALTER TABLE
然后在另一次迁移中运行代码?
答案 0 :(得分:13)
重点是EF作为事务的一部分执行迁移。
你在里面打开一个新的交易,这是没有必要的,只需使用
AlterColumn("dbo.SomeTable", "SomeField", c => c.String(maxLength: 100, unicode: false));
Sql("UPDATE dbo.SomeTable SET SomeField = '' + SomeField + SomeField");
在这种情况下,Sql()
函数将在同一事务上下文中运行,并且不应出现错误。
编辑:澄清Sql()
函数的事务上下文。