Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架4.2,无法在上设置标识插入_C#_Asp.net_Asp.net Mvc_Ado.net_Entity Framework 4.1 - Fatal编程技术网

C# 实体框架4.2,无法在上设置标识插入

C# 实体框架4.2,无法在上设置标识插入,c#,asp.net,asp.net-mvc,ado.net,entity-framework-4.1,C#,Asp.net,Asp.net Mvc,Ado.net,Entity Framework 4.1,我想将大量记录添加到具有给定ID的表中,这样我就可以构建一个层次结构,以树状视图的方式显示记录。我可以单独添加工作正常且不设置ID的记录。我只想批量设置ID,因此我将实体ID列中的DatabaseGenerated选项设置为None,设置为None using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew)) { foreach (ErrorCode ec in er

我想将大量记录添加到具有给定ID的表中,这样我就可以构建一个层次结构,以树状视图的方式显示记录。我可以单独添加工作正常且不设置ID的记录。我只想批量设置ID,因此我将实体ID列中的
DatabaseGenerated
选项设置为
None
,设置为
None

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语句,但我希望使用entity framework。似乎
db.Database.ExecuteSqlCommand
位于单独的作用域中,它立即关闭,在执行
db.savechanged
时不可用。

尝试以下操作:

也许是这样:

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

这是我验证过的代码,它符合您的要求。其思想是对ExecuteSqlCommand和insert操作使用单一连接,而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();
        }
    }
}

我也遇到了同样的问题,我们有一张桌子,这张桌子上摆的是身份证。 然后,我们需要将标识转换为false(我的意思是按如下所示进行设置)

但是,在执行迁移和更新数据库之后,这不起作用。 在谷歌搜索了这个问题后,我发现 这表明打开/关闭标识不是一个简单的操作,实体框架现在不支持它

因此,解决方案(对我有效)如下

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ID { get; set; }
在Visual Studio中,在designer视图中打开该表,并选择表示主键的列(在本例中为“ID”),然后从属性面板中找到“Identity Specification”属性(该属性的值必须为true),将其设置为false, 不要忘记更新表,方法是单击update按钮在表上执行SQL语句。(表格工具栏中存在“更新”按钮)

然后试着运行你的代码,它应该可以工作


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

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


很抱歉没有回答这个问题,但我认为你的解决方案不对

我确实试过,“连接被关闭”这个问题以前被问过并回答过