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

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()功能的事务上下文.