执行以下脚本时出现以下错误。错误是什么,如何解决?
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
错误:
服务器:消息 544,级别 16,状态 1,行 1
当 IDENTITY_INSERT 设置为 OFF 时,无法在表“表”中插入标识列的显式值。
执行以下脚本时出现以下错误。错误是什么,如何解决?
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
错误:
服务器:消息 544,级别 16,状态 1,行 1
当 IDENTITY_INSERT 设置为 OFF 时,无法在表“表”中插入标识列的显式值。
您插入的值OperationId
是一个标识列。
您可以像这样在表上打开身份插入,以便您可以指定自己的身份值。
SET IDENTITY_INSERT Table1 ON
INSERT INTO Table1
/*Note the column list is REQUIRED here, not optional*/
(OperationID,
OpDescription,
FilterID)
VALUES (20,
'Hierachy Update',
1)
SET IDENTITY_INSERT Table1 OFF
不要为 OperationID 赋值,因为它会自动生成。尝试这个:
Insert table(OpDescription,FilterID) values ('Hierachy Update',1)
简单地说,如果您在 SQL 服务器上收到此错误,则运行此查询 -
SET IDENTITY_INSERT tableName ON
这仅适用于单个数据库表,
例如,如果表名是,student
则查询如下所示:
SET IDENTITY_INSERT student ON
如果您在 Web 应用程序或使用实体框架时遇到此错误,请首先在 SQL 服务器上运行此查询并更新您的实体模型 (
.edmx file
) 并构建您的项目,此错误将得到解决
将 IDENTITY_INSERT 设置为 ON 时要非常小心。除非数据库处于维护模式并设置为单用户,否则这是一种不好的做法。这不仅会影响您的插入,还会影响其他任何试图访问该表的人。
您为什么要尝试将值放入身份字段?
在该表的实体中,在DatabaseGenerated
设置了身份插入的列上方添加属性:
例子:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
基本上有两种不同的方式来插入记录而不会出错:
1) 当 IDENTITY_INSERT 设置为 OFF 时。主键“ID”不得存在
2) 当 IDENTITY_INSERT 设置为 ON 时。必须存在主键“ID”
根据使用 IDENTITY PRIMARY KEY 创建的同一表中的以下示例:
CREATE TABLE [dbo].[Persons] (
ID INT IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(40) NOT NULL,
FirstName VARCHAR(40)
);
1) 在第一个示例中,当 IDENTITY_INSERT 为 OFF 时,您可以向表中插入新记录而不会出错。“INSERT INTO”语句中不得存在主键“ID” ,并且将自动添加唯一的 ID 值: . 如果在这种情况下从 INSERT 中存在 ID,您将收到错误“无法为表中的标识列插入显式值...”
SET IDENTITY_INSERT [dbo].[Persons] OFF;
INSERT INTO [dbo].[Persons] (FirstName,LastName)
VALUES ('JANE','DOE');
INSERT INTO Persons (FirstName,LastName)
VALUES ('JOE','BROWN');
表 [dbo].[Persons] 的输出将是:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
2) 在第二个示例中,您可以在 IDENTITY_INSERT 为 ON 时向表中插入新记录而不会出错。只要 ID 值不存在,“INSERT INTO”语句中的主键“ID”必须存在:如果在这种情况下 INSERT 中不存在 ID,您将收到错误“显式值必须是为标识列表指定..."
SET IDENTITY_INSERT [dbo].[Persons] ON;
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (5,'JOHN','WHITE');
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (3,'JACK','BLACK');
表 [dbo].[Persons] 的输出将是:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
3 BLACK JACK
5 WHITE JOHN
例如,如果您的表名是School ,您可以简单地使用此语句。在插入之前确保 identity_insert 设置为 ON并在插入查询之后将 identity_insert 设置为OFF
SET IDENTITY_INSERT School ON
/*
insert query
enter code here
*/
SET IDENTITY_INSERT School OFF
请注意,如果您用 关闭每一行;
,则该SET IDENTITY_INSERT mytable ON
命令将不适用于以下行。
即
像这样的查询
SET IDENTITY_INSERT mytable ON;
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole');
给出错误
Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is set to OFF.
但是这样的查询会起作用:
SET IDENTITY_INSERT mytable ON
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole')
SET IDENTITY_INSERT mytable OFF;
似乎该SET IDENTITY_INSERT
命令仅适用于交易,而;
will 表示交易的结束。
如果您使用 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>
每个人都在评论 SQL,但 EntityFramework 发生了什么?我花了整篇文章阅读,没有人解决 EF。所以几天后找到了解决方案:EF Core 在创建模型的上下文中有这样的指令: modelBuilder.Entity<Cliente>(entity => { entity.Property(e => e.Id).ValueGeneratedNever();
这也会产生错误,解决方案:您必须通过 ValueGeneratedOnAdd() 及其作品进行更改!
您的查询中有预先提到的 OperationId,它不应该存在,因为它是自动递增的
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
所以你的查询将是
Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)
另一种情况是检查主键是否与您的类同名,唯一的区别是您的主键附加了一个“ID”,或者在与如何使用无关的主键上指定 [Key]类被命名。
最好的解决方案是使用注释GeneratedValue(strategy = ...)
,即
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;
它说,此列是由数据库使用 IDENTITY 策略生成的,您不需要照顾 - 数据库会这样做。
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
在 PrimaryKey 列中添加这行代码并确保将其设置为数据类型int来纠正。如果该列是主键并且在 SQL 中将 IsIDentity 设置为 true,则不需要这行代码[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
如果您在使用带有 sequelize-typescript npm 的 sql-server 时遇到此问题,请确保添加@AutoIncrement
到 ID 列:
@PrimaryKey
@AutoIncrement
@Column
id!: number;
EF 核心 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 });
});
}
在我的情况下,我在我的模型构建器的上下文中设置了另一个属性作为键。
modelBuilder.Entity<MyTable>().HasKey(t => t.OtherProp);
我必须设置正确的 id
modelBuilder.Entity<MyTable>().HasKey(t => t.Id);
而如果你使用Oracle SQL Developer连接,记得添加/ sqldev:stmt /
/ sqldev:stmt /set identity_insert TABLE on;
第一件事首先...
您首先需要知道为什么会出现错误。
让我们看一个 JSON 数据的简单 HttpPost,如下所示:
{
"conversationID": 1,
"senderUserID": 1,
"receiverUserID": 2,
"message": "I fell for the wrong man!",
"created":"2022-02-14T21:18:11.186Z"
}
如果您在连接到 SQLServer 或任何其他数据库服务器时使用实体框架核心生成数据库,则数据库会自动负责更新和自动生成标识列的键/唯一标识符,在大多数情况下,它是一个整数值自动增量。
为了使用内置约定安全地发布您的数据,让您处于更安全的状态,只需从您要发送到数据库的数据中删除 ID 字段,然后让数据库引擎和 ef-core 完成繁重的工作旨在做。
因此,发布数据的正确方法是:
{
"senderUserID": 1,
"receiverUserID": 2,
"message": "I fell for the wrong man!",
"created":"2022-02-14T21:18:11.186Z"
}
你会注意到我拿出了 ConversationID。
您可以在此网站上了解有关实体框架的更多信息:https ://entityframeworkcore.com
我希望您在应用程序中更多地遵守约定而不是配置。知道如何使用已经证明的标准和惯例来做事,将为您节省大量的工作时间。
在我的案例中,我插入的字符多于表中定义的字符。
在 My Table 列中定义为nvarchar(3)
,我传递了 3 个以上的字符,并且出现了相同ERROR
的消息。
它没有答案,但在某些情况下可能是类似的问题
我不确定“插入表”的用途是什么,但如果您只是想插入一些值,请尝试:
Insert Into [tablename] (OpDescription,FilterID)
values ('Hierachy Update',1);
我有同样的错误信息出现,但我认为这应该工作。只要 ID 是主键,它就会自动递增。
在 [HttpPost] 方法上放置断点并检查传递给 Id 属性的值。如果它不是零,则将发生此错误。
每次我想向数据库添加任何内容时,我都通过创建一个新对象来解决这个问题。
即使一切正确,如果 Identity 列的数据类型不是 int 或 long,也会出现此错误。我的身份列是十进制的,尽管我只保存 int 值(我的错)。更改数据库和底层模型中的数据类型为我解决了这个问题。
使用带有这样的模型的实体框架遇到了同样的问题(我简化了原始代码):
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;}
}
Run 与 Pipeline 具有多对一的关系(一个 Pipeline 可以运行多次)
在我RunService
的中,我将 DbContex 注入为context
. 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;
}
我正在使用 asp.net core 5.0,我得到了那个错误。我收到该错误是因为我正在添加另一个数据并触发其他.SaveChanges()
方法,如下所示:
_unitOfWorkVval.RepositoryVariantValue.Create(variantValue);
int request = HttpContext.Response.StatusCode;
if (request == 200)
{
int tryCatch = _unitOfWorkCVar.Complete();
if (tryCatch != 0)
{
productVariant.CategoryVariantID = variantValue.CategoryVariantID;
productVariant.ProductID = variantValue.ProductID;
productVariant.CreatedDate = DateTime.Now;
_unitOfWorkProductVariant.RepositoryProductVariant.Create(productVariant);
_unitOfWorkVval.RepositoryVariantValue.Create(variantValue);
int request2 = HttpContext.Response.StatusCode;
if(request==200)
{
int tryCatch2=_unitOfWorkProductVariant.Complete();//The point where i get that error
}///.......
Simply delete the tables that are dragged into your .dbml file and re-drag them again. Then Clean solution>Rebuild solution> Build solution.
Thats what worked for me.
I didnt made the table on my own, I was using VS and SSMS, I followed this link for ASP.NET Identity:https://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/adding-aspnet-identity-to-an-empty-or-existing-web-forms-project
如果您使用接口并以通用方式实现 savechanges 方法,则使用非类型化 DBContext 或 DBSet 引发的问题
如果这是你的情况,我建议例如强类型 DBContex
MyDBContext.MyEntity.Add(mynewObject)
然后.Savechanges
会工作