【问题标题】:Entity Framework 4.2, Unable to set Identity Insert ON实体框架 4.2,无法将身份插入设置为 ON
【发布时间】:2015-11-27 06:22:34
【问题描述】:

我想将记录批量添加到具有给定 ID 的表中,这样我就可以构建一个层次结构来以树视图的方式显示记录。我可以单独添加运行良好的记录并且我不设置 ID。我只想批量设置 Id,所以我在我的实体的 id 列中将DatabaseGenerated 选项设置为NoneNone

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{

     foreach (ErrorCode ec in errorCodesStep3.errorcodesUsers)
     {

           errorCode.ID = ec.ID;
           errorCode.ParentID = ec.ParentID;
           errorCode.ErrorDescription = ec.ErrorDescription;
           db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ErrorCode ON");
           db.ErrorCode.Add(errorCode);
           db.SaveChanges();    
           scope.Complete();
     }
}

错误代码

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ID { get; set; }

我收到以下错误:

身份插入关闭时无法设置身份。

不知道出了什么问题,因为我看到了可以打开身份插入的示例。我正在使用 EF 版本 4.2.0.0 和运行时版本 v4.0.30319。我可以通过executeSQL 轻松添加带有参数化变量的INSERT 语句,但我想使用实体框架来完成。似乎db.Database.ExecuteSqlCommand 在一个单独的范围内,它立即关闭并且在执行db.savechanged 时不可用。

【问题讨论】:

标签: c# asp.net asp.net-mvc ado.net entity-framework-4.1


【解决方案1】:

试试这个:Entity Framework with Identity Insert

也许是这样:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
    using (var db = new Context()) // your Context
    {
        db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ErrorCode ON");
        ErrorCode errorCode = db.ErrorCode.First(); // for example
        foreach (ErrorCode ec in errorCodesStep3.errorcodesUsers)
        {
            errorCode.ID = ec.ID;
            errorCode.ParentID = ec.ParentID;
            errorCode.ErrorDescription = ec.ErrorDescription;    
            db.ErrorCode.Add(errorCode);
        }
        db.SaveChanges();
        db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ErrorCode OFF");
        scope.Complete();
    }
}

【讨论】:

  • 我试过了,“说连接已关闭”
【解决方案2】:

这是我验证的代码,可以满足您的要求。这个想法是对 ExecuteSqlCommand 和插入操作使用单一连接,似乎 BeginTransaction() 调用可以解决问题:

using (var db = new TestEntities()) { 
    using (var tran = db.Database.BeginTransaction()) {
       db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Error ON");
            foreach (var id in Enumerable.Range(1, 20)) {
                var ec = new Error();
                ec.ErrorID = id;
                db.Errors.Add(ec);
            }
            db.SaveChanges();
            db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Error OFF");
            tran.Commit();
        }
    }
}

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,我们有一张表,它是设置的。 然后我们需要将身份切换为false,(我的意思是如下)

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID { get; set; }
    

    但是,这在迁移和更新数据库后不起作用。 在谷歌搜索问题后,我创建了this article 这表明切换 ON/OFF 身份不是一个简单的操作,Entity Framework 现在不支持。

    所以解决方案(对我有用)如下

    在 Visual Studio 中打开设计器视图中的表并选择代表主键的列(在您的情况下为“ID”),然后从属性面板中找到“身份规范”属性(它必须具有true 的值)将其设置为 false, 并且不要忘记更新表,通过单击更新按钮对表执行 SQL 语句。 (更新按钮存在于表格工具栏中)

    然后尝试运行您的代码,它应该可以工作。

    我希望这会有所帮助。如果您有任何问题,请告诉我。

    【讨论】:

      【解决方案4】:

      添加另一列来管理层次结构。标识列不应用于此目的。

      很抱歉没有回答这个问题,但我认为您的解决方案不正确。

      【讨论】:

        猜你喜欢
        • 2013-09-13
        • 1970-01-01
        • 2020-06-06
        • 2015-10-18
        • 2018-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多