我在Context上的SaveChangesAsync期间遇到了一些问题。我收到此错误: INSERT语句与FOREIGN KEY约束冲突
我认为这个错误的原因是不言自明的,我的实体中有一些关于外部密钥的违规行为。但... 让我解释一下我的环境:
我有2个实体处于1:N关系(让我们说' Item1'可以与N' Item2'相关联)。我的实体看起来像:
public class Item1
{
[Key]
public int Id { get; set; }
[...]
//navigation property
public ICollection<Item2> Item2list{ get; set; }
}
public class Item2
{
[Key]
public int Id { get; set; }
[..]
//navigation property
public int Item1Id{ get; set; }
public Item1 Item1{ get; set; }
}
所以在我的代码中,在我构建了这些项目的两个实例(oItem1和oItem2)后,我有:
oItem1.Item2list.Add(oItem2);
myRepository.Add(oItem1);
一切似乎都很好,但是当我打电话给
时Context.SaveChangesAsync()
我得到(随机,它不会每次都出现)我之前提到的错误。如果我检查我的上下文的本地缓存,我会看到一些&#39; Item2&#39;有一个&#39; Item1Id = 0&#39;这与它应该引用的实体的Id不匹配。 并且,它看来,这个错误只发生在2-3个案例中(超过6000个实体,每次都在不同的项目上)。当然我无法将它们保存在我的数据库中,但我不明白为什么会出现这种情况以及如何解决它。
注意:我在多线程环境中运行,我的错误建议的性质与之相关。但我还要指出,每个线程都构建了自己的“项目1”和“#3;和&#39; Item2&#39;。存储库(上下文)对每个人都是相同的,因为我将它注入主类的构造函数中。
我没想到你会解决我的问题(但如果你这样做会很棒:P),但我想知道一些关于要检查的提示/提示。
我真的卡住了。
答案 0 :(得分:0)
$('#myIdAwesomeIcon').css("color","#009900");
引用.css( propertyName, value )
Item2
作为外键,这使得Item1Id
在Item1
表中的ID存在之前应该存在至关重要
您需要按给定的顺序执行以下操作:
将Item1
保存到相应的表格中。
将Item2
保存到相应的表格中。从上面的步骤将Item1
设置为Item2
的{{1}}。
Item1Id
获取Id
来获取Item1
列表。 (见下面的代码)写入数据库的代码:
Item2
从数据库中读取的代码:
Item1
或使用oItem1.Id = 2 //some Id
// setting other oItem1 properties
myRepository.Add(oItem1);
// setting oItem2 properties
oItem2.Item1Id = oItem1.Id;
myRepository.Add(oItem1);
Context.SaveChangesAsync();