【问题标题】:SET IDENTITY_INSERT not workingSET IDENTITY_INSERT 不起作用
【发布时间】:2017-05-21 17:14:29
【问题描述】:

如果使用实体框架和 SQL Server 执行 SET IDENTITY_INSERT 是否会在任何情况下无法工作,尽管它可以使用相同凭据在同一数据库上的 SSMS 中工作 (sa)

System.Data.Entity.Core.Objects.ObjectContext oContext = ((IObjectContextAdapter)dbContext).ObjectContext;

ExecuteSql(oContext, "SET IDENTITY_INSERT dbo.Albums ON");
ExecuteSql(oContext, "INSERT INTO dbo.Albums ([Id], [Name], [Description]) VALUES (-2, 'album1', 'album1')");

这会引发错误:

System.Data.SqlClient.SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“相册”中插入标识列的显式值。

但是,当我在 SSMS 中运行这 2 行相同的代码时,身份插入工作正常。

使用:

  • SQL Server 2014 Developer Edition(64 位)版本 13.0.4202.2,在 localhost 上运行
  • 实体框架版本 6.0.0.0*

ExecuteSQL方法如下:

public static void ExecuteSql(System.Data.Entity.Core.Objects.ObjectContext c, string sql)
{
     var entityConnection = (System.Data.Entity.Core.EntityClient.EntityConnection)c.Connection;

     DbConnection conn = entityConnection.StoreConnection;
     ConnectionState initialState = conn.State;

     using (DbCommand cmd = conn.CreateCommand())
     {
         cmd.CommandText = sql;
         cmd.ExecuteNonQuery();
     }
}

【问题讨论】:

    标签: sql-server entity-framework


    【解决方案1】:

    尝试将SET IDENTITY_INSERT TableName ON 放入同一个查询中,如下所示:-

    ExecuteSql(oContext, "SET IDENTITY_INSERT dbo.Albums ON; 
    INSERT INTO dbo.Albums ([Id], [Name], [Description]) 
    VALUES (-2, 'album1', 'album1')");
    

    【讨论】:

    • 难以置信。想知道为什么这会有所作为。
    • 连接否则可以返回到语句之间的连接池,并重置。您还可以显式打开 DbContext.Database.Connection 以强制它保持打开状态。
    猜你喜欢
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2012-08-13
    • 2013-04-19
    相关资源
    最近更新 更多