![](/img/trans.png)
[英]EF Core / Sqlite one-to-many relationship failing on Unique Index Constraint
[英]EF6 with Sqlite one-to-many relationship failing on Unique Constraint
使用 Entity Framework 6 将具有一对多关系的实体插入 SQLite 数据库时遇到问题。让我们考虑这个例子:
Model
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 约束失败
我明白为什么它不起作用,但我无法找到让它起作用的方法。 使用相同的上下文不是一个选项,因为应用程序可能会在创建 Box 和添加 Item 之间重新启动。 我找到了相同问题的答案,但使用的是 EF 核心而不是 EF6( 就在那里(堆栈溢出) ),但我无法使用 EF6 访问ChangeTracker
的TrackGraph
属性。
我还需要有一个完全通用的方法来解决这个问题,因为我的 Boxes 中可能有其他对象而不是 Items。
好的,所以我想了一个办法。
在调用db.SaveChanges()
之前,我执行此代码,其中实体是我刚刚添加到 DbContext 的实体列表。 这样,只添加了我明确想要添加的实体,不添加其他相关实体,因此我不会遇到唯一约束失败,因为 DbContext 没有重新创建相关实体。
db.ChangeTracker.Entries().ToList().ForEach(dbe => {
if (!entities.Contains(dbe.Entity)) {
dbe.State = EntityState.Unchanged;
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.