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

时间:2015-02-20 23:46:27

标签: 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();
}

但是我收到了这个错误:

  

支持' TheEntityContext'从那时起,情境就发生   数据库已创建。考虑使用Code First Migrations   更新数据库(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();
}

但是我收到了这个错误:

  

字符串或二进制数据将被截断。

然后,我是ALTER TABLE语句,以使字段在UPDATE语句运行之前更长时间没有生效?所以我将UDPDATE语句更改为50个字符的字符串,运行正常。运行Update-Database -Verbose也表示它未在ALTER TABLE语句之前运行UPDATE语句。

那么这笔交易是什么?我是否必须在一次迁移中运行ALTER TABLE然后在另一次迁移中运行代码?

1 个答案:

答案 0 :(得分:13)

重点是EF作为事务的一部分执行迁移。

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

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

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

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

编辑:澄清Sql()函数的事务上下文。