当我执行下面的脚本时,我有以下错误。错误是关于什么,如何解决?

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)

错误:

服务器:Msg 544,级别16,状态1,线路1 当IDENTITY_INSERT设置为OFF时,无法为表'table'中的标识列插入显式值。


当前回答

设置该字段的身份增量时,不能在“OperationID”列中插入数据。

不要在该字段中输入值,它将自动设置。

Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)

其他回答

请注意,如果您用;结束每一行,SET IDENTITY_INSERT mytable ON命令将不适用于以下行。

即。 像这样的查询

SET IDENTITY_INSERT mytable ON;
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole');

给出错误 当IDENTITY_INSERT设置为OFF时,无法为表'mytable'中的身份列插入显式值。

但是像这样的查询是可以的:

SET IDENTITY_INSERT mytable ON
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole')
SET IDENTITY_INSERT mytable OFF;

SET IDENTITY_INSERT命令似乎只适用于事务,而;将表示事务的结束。

EF Core 3.x

引用Leniel Maccaferri,我有一个带有自动递增属性的表,称为ID(原始主键)和另一个属性称为Other_ID(新的主键)。最初ID是主键,但后来Other_ID需要成为新的主键。由于ID正在应用程序的其他部分使用,我不能只是从表中删除它。Leniel Maccaferri解决方案只适用于我之后,我添加了以下片段:

        entity.HasKey(x => x.Other_ID);
        entity.Property(x => x.ID).ValueGeneratedOnAdd();

完整代码片段如下(ApplicationDbContext.cs):

  protected override void OnModelCreating(ModelBuilder builder)
  {
        builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
        base.OnModelCreating(builder);
        builder.Entity<tablename>(entity =>
        {
            entity.HasKey(x => x.Other_ID);
            entity.Property(x => x.ID).ValueGeneratedOnAdd();
            entity.HasAlternateKey(x => new { x.Other_ID, x.ID });                
        });
        
    }

在您的查询中有前面提到的OperationId,它不应该在那里,因为它是自动递增的

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)

所以你的问题是

Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)

使用实体框架与这样的模型有同样的问题(我简化了原始代码):

public class Pipeline
{
  public Pipeline()
  {
     Runs = new HashSet<Run>();
  }

  public int Id {get; set;}
  public ICollection<Run> Runs {get;set;}
}

public class Run
{
  public int Id {get; set;}
  public int RequestId {get; set;}
  public Pipeline Pipeline {get;set;}
}

运行与管道有多对1的关系(一个管道可以运行多次)

在我的RunService中,我注入了dbcontext作为上下文。DbContext有一个Runs DbSet。我在RunService中实现了这个方法:

public async Task<Run> CreateAndInit(int requestId, int pplId)
{
  Pipeline pipeline = await pipelineService.Get(pplId).FirstOrDefaultAsync().ConfigureAwait(false);
  Run newRun = new Run {RequestId = requestId, Pipeline = pipeline};
  context.Runs.Add(newRun);
  await context.SaveChangesAsync().ConfigureAwait(false); // got exception in this line
  return newRun;
}

当方法执行时,我得到了这个异常:

Exception has occurred: CLR/Microsoft.EntityFrameworkCore.DbUpdateException
Exception thrown: 'Microsoft.EntityFrameworkCore.DbUpdateException' in System.Private.CoreLib.dll: 'An error occurred while updating the entries. See the inner exception for details.'
 Inner exceptions found, see $exception in variables window for more details.
 Innermost exception     Microsoft.Data.SqlClient.SqlException : Cannot insert explicit value for identity column in table 'Pipelines' when IDENTITY_INSERT is set to OFF.

对我来说,解决方案是将对象和关系的创建分开

public async Task<Run> CreateAndInit(int requestId, int pplId)
{
  Pipeline pipeline = await pipelineService.Get(pplId).FirstOrDefaultAsync().ConfigureAwait(false);
  Run newRun = new Run {RequestId = requestId};
  context.Runs.Add(newRun);
  newRun.Pipeline = pipeline; // set the relation separately
  await context.SaveChangesAsync().ConfigureAwait(false); // no exception
  return newRun;
}

如果您正在使用liquibase更新SQL Server,则可能试图将记录键插入到autoIncrement字段中。通过从插入中删除列,脚本应该可以运行。

<changeSet id="CREATE_GROUP_TABLE" >
    <createTable tableName="GROUP_D">
        <column name="GROUP_ID" type="INTEGER" autoIncrement="true">
            <constraints primaryKey="true"/>
        </column>
    </createTable>
</changeSet>

<changeSet id="INSERT_UNKNOWN_GROUP" >
    <insert tableName="GROUP_D">    

        <column name="GROUP_ID" valueNumeric="-1"/>
 ...
    </insert>
</changeSet>