EF6 与 Sqlite 一对多关系在唯一约束上失败

EF6 with Sqlite one-to-many relationship failing on Unique Constraint

我 运行 在使用 Entity Framework 将具有一对多关系的实体插入 SQLite 数据库时遇到问题 6. 让我们考虑这个例子:

型号

public class Box {
    public int BoxId { get; set; }
    public ICollection<Item> Items{ get; set; }
}

public class Item {
    public int ItemId { get; set; }
    public Box Box { get; set; }
}

插入

Box box = new Box(){BoxId = 1};
Item item = new Item(){ItemId = 1, Box = box};
using (var db = new MyDbContext()) {
    db.Boxes.Add(box);
    db.SaveChanges();
    db.Items.Add(item);
    db.SaveChanges();
}

此代码段有效。

Box box = new Box(){BoxId = 1};
Item item = new Item(){ItemId = 1, Box = box};
using (var db = new MyDbContext()) {
    db.Boxes.Add(box);
    db.SaveChanges();
}
using (var db = new MyDbContext()) {
    db.Items.Add(item);
    db.SaveChanges();
}

此代码段无效,抛出消息 UNIQUE constraint failed 的异常

我明白为什么它不起作用,但我想不出让它起作用的方法。使用相同的上下文不是一种选择,因为应用程序可能会在创建 Box 和添加 Item 之间重新启动。我找到了同一个问题的答案,但使用 EF 核心而不是 EF6 (right there (Stack Overflow)),但我无法使用 EF6 访问 ChangeTrackerTrackGraph 属性。

我还需要一个完全通用的方法来解决这个问题,因为我的盒子里可能有其他物品而不是物品。

好吧,我想办法了。

在调用 db.SaveChanges() 之前,我执行了这段代码,其中实体是我刚刚添加到 DbContext 的实体列表。这样只会添加我明确想要添加的实体,不会添加其他相关实体,因此我不会 运行 进入 Unique constraint failed because DbContext is not recreating related entities.

db.ChangeTracker.Entries().ToList().ForEach(dbe => {
    if (!entities.Contains(dbe.Entity)) {
        dbe.State = EntityState.Unchanged;
    }
});