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 访问 ChangeTracker
的 TrackGraph
属性。
我还需要一个完全通用的方法来解决这个问题,因为我的盒子里可能有其他物品而不是物品。
好吧,我想办法了。
在调用 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;
}
});
我 运行 在使用 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 访问 ChangeTracker
的 TrackGraph
属性。
我还需要一个完全通用的方法来解决这个问题,因为我的盒子里可能有其他物品而不是物品。
好吧,我想办法了。
在调用 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;
}
});