【发布时间】:2020-02-03 03:38:37
【问题描述】:
我正在尝试使用 EF Core、SQL Server 和 C# 在我的表中插入一个新行,但我无法让 EF Core 正确使用标识列。
这是我正在做的事情:
我正在使用 Entity Framework 生成的类创建一个新对象(我在帖子末尾包含了实体类定义)
EmployeePermissions employee_permission = new EmployeePermissions
{
FkEmployee = PkEmployee,
FkPermission = permission_key
};
然后我调用db.EmployeePermissions.add(employee_permission),它适用于对象来自[FromBody] <Entity Class> <object_variable> 的所有调用(尽管使用其他表)。
但是在这里,当我自己实例化这个类时,我得到了这个错误:
SqlException (0x80131904):当 IDENTITY_INSERT 设置为 OFF 时,无法在表“Employee_Permissions”中插入标识列的显式值。
我不明白为什么会这样——我希望它自动增加标识列。我使用ObjectDumper 来查看传递给.Add() 的内容,如下:
properties {
PkEmployeePermissions = 0 [System.Int32] // this is the identity column, of course
FkEmployee = 31 [System.Int32]
FkPermission = 6 [System.Int32]
FkEmployeeNavigation = <null>
FkPermissionNavigation = <null>
}
我已经调查了其他运行良好的调用([FromBody] 创建对象的调用)并且标识列在这些调用中也简单地等于0,所以我不明白这里有什么不同。
我是否错误地配置了数据库中的某些内容?我在列属性中仔细检查了PkEmployeePermissions 列确实是一个标识列,所以它应该自动递增。
如果有帮助,这里是 Entity 类:
public partial class EmployeePermissions
{
public int PkEmployeePermissions { get; set; }
public int FkEmployee { get; set; }
public int FkPermission { get; set; }
public Employee FkEmployeeNavigation { get; set; }
public Permission FkPermissionNavigation { get; set; }
}
【问题讨论】:
-
@AbdullahDibas 这确实是解决方案!我需要重新生成数据库脚手架。在我将主键设置为身份列之后,我一定忘记了这样做。
-
经过进一步调查,确切的问题是该列在 EF Core 数据库上下文文件中的
modelBuilder内设置了.ValueGeneratedNever()。我会将其添加到实际答案中,因此它不是另一个问题的直接重复,而是提供一些适当的上下文,说明这在 EF Core 中是如何发生的。
标签: c# sql-server entity-framework entity-framework-core