无法保存上下文 - 外键问题

时间:2018-04-23 06:16:25

标签: c# entity-framework

我在Context上的SaveChangesAsync期间遇到了一些问题。我收到此错误: INSERT语句与FOREIGN KEY约束冲突

我认为这个错误的原因是不言自明的,我的实体中有一些关于外部密钥的违规行为。但... 让我解释一下我的环境:

  1. 我有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; }
    
    }
    
  2. 所以在我的代码中,在我构建了这些项目的两个实例(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),但我想知道一些关于要检查的提示/提示。

    • 你会看哪个部分?
    • 您过去是否遇到过这类问题?
    • 这可能与我用多线程运行的事实有关吗?

    我真的卡住了。

1 个答案:

答案 0 :(得分:0)

$('#myIdAwesomeIcon').css("color","#009900"); 引用.css( propertyName, value ) Item2作为外键,这使得Item1IdItem1表中的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();

的等效方法