当IDENTITY_INSERT设置为OFF时,无法在表中插入标识列的显式值

时间:2017-02-04 17:08:48

标签: c# entity-framework identity

好吧,这个问题已被问过几次。但我无法找到理由为什么我在这种情况下得到这个理由。以下是表格和代码的设置方式。

public class ObjectA{
  public int Id;
  public virtual ICollection<ObjectB> Bs;
}

public class ObjectB{
  public int Id;
  public virtual ICollection<ObjectA> As;
}

B上的POCO映射:

HasMany(As).WithMany(Bs).Map(ToTable("ObjectA_ObjectB_Mapping"))

共有3个表格:

ObjectA
  Id (PK, Int) - AutoIncrement

ObjectB
  Id(PK, Int)  - AutoIncrement

ObjectA_ObjectB_Mapping
  ObjectA_Id
  ObjectB_Id

这里插入了新对象:

var a = new ObjectA(){}; --> This record already exist in table
var b = new ObjectB(){
  A = a; --> Just read only copy
};

尝试此插入时,我收到有关IDENTITY_INSERT设置为OFF的错误。 当我查看EF生成的SQL时,我可以看到它正在尝试在ObjectB的字段Id中插入值。似乎有些东西想要明确地想要设置这个Id值。我错过了关于设置多少个关系的东西??

上面的代码只是一个非常简化的伪表示,所以你可以跳过关于告诉姓名,风格等的评论。

由于

1 个答案:

答案 0 :(得分:0)

最简单的解决方法是set IDENTITY_INSERT to ON,但我怀疑这不是根本问题,我不建议这样做是因为显而易见的原因,这只是不好的做法。

听起来像EF(或你)试图管理ID本身,而不是允许SQL服务器。我不知道为什么,我怀疑你的实际对象有事情发生,但你也可以将pack(在grid名称空间中)附加到模型上的DatabaseGeneratedAttribute列强制EF 创建System.ComponentModel.DataAnnotations.Schema列(或Id,具体取决于DBMS),这就要求您,开发人员进行管理完全是该模型上的IDENTITY(1, 1)列。 (在您执行任何 SQL操作之前,您必须确保AutoIncrement设置正确,包括Id。)

Id

这将删除.Add约束(或[DatabaseGenerated(DatabaseGeneratedOption.None)] public int Id { get; set; } ,无论它是什么)。您必须为此运行迁移才能生效,但一旦完成,您就不应再出现此错误。您只需非常小心,确保在之前设置IDENTITY(1, 1) 来调用AutoIncrementId。 (无论你使用哪个。)

您还应该在DatabaseContext.SaveChanges()列上明确定义DatabaseContext.SaveChangesAsync()(来自KeyAttribute)。

System.ComponentModel.DataAnnotations