d51*_*512 7 entity-framework ef-migrations
我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)
但是我收到了这个错误:
自创建数据库以来,支持'TheEntityContext'上下文的模型已更改.请考虑使用"代码优先迁移"来更新数据库(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();
}
Run Code Online (Sandbox Code Playgroud)
但是我收到了这个错误:
字符串或二进制数据将被截断.
那么我的ALTER TABLE声明是否会使该字段在UPDATE语句运行之前更长时间没有生效?所以我将UDPDATE语句改为50个字符的字符串,它运行正常.运行Update-Database -Verbose还表示它没有在ALTER TABLE语句之前运行UPDATE语句.
那么这里的交易是什么?我是否必须ALTER TABLE在一次迁移中运行代码以在另一次迁移中更新表?
Ste*_*ndl 14
关键是EF作为事务的一部分执行迁移.
你在里面打开一个新的交易,这是没有必要的,只需使用
AlterColumn("dbo.SomeTable", "SomeField", c => c.String(maxLength: 100, unicode: false));
Sql("UPDATE dbo.SomeTable SET SomeField = '' + SomeField + SomeField");
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Sql()函数将在相同的事务上下文中运行,并且不应出现错误.
编辑:澄清Sql()功能的事务上下文.