好吧,这个问题已被问过几次。但我无法找到理由为什么我在这种情况下得到这个理由。以下是表格和代码的设置方式。
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值。我错过了关于设置多少个关系的东西??
上面的代码只是一个非常简化的伪表示,所以你可以跳过关于告诉姓名,风格等的评论。
由于
答案 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)
来调用AutoIncrement
或Id
。 (无论你使用哪个。)
您还应该在DatabaseContext.SaveChanges()
列上明确定义DatabaseContext.SaveChangesAsync()
(来自KeyAttribute
)。
System.ComponentModel.DataAnnotations