EF6搭配SQLite无外键一对多关系插入时唯一约束失败问题
EF6操作SQLite无外键一对多插入时唯一约束失败的问题及疑问
使用Entity Framework 6(EF6)操作SQLite数据库时,遇到无外键一对多关系实体插入触发唯一约束失败的问题,且无法修改不使用外键的现状。
模型定义
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的Item代码
Box box = new Box(){BoxId = 1}; Item item = new Item(){ItemId = 1, Box = box}; using (var db = new MyDbContext()) { db.Items.Add(item); db.SaveChanges(); }
此操作可成功创建Item和Box,但重复执行上述代码时,会出现"唯一约束失败"错误——原因是EF6会尝试创建ID为1的重复Box。
现有解决方案:Box校验逻辑
Box box = new Box(){BoxId = 1}; Item item = new Item(){ItemId = 1, Box = box}; using (var db = new MyDbContext()) { var existingBox = db.Box.FirstOrDefault(x => x.BoxId == box.BoxId); item.Box = existingBox ?? item.Box; db.Items.Add(item); db.SaveChanges(); }
疑问
- 是否必须每次从数据库获取Box?
- 如果必须从数据库获取,能否将Box对象存入缓存复用?
- 如何抽象获取Box的逻辑,避免重复代码?
- 能否创建BoxService并在内部使用新的作用域上下文获取Box?
补充代码(上下文与迁移)
迁移代码
migrationBuilder.CreateTable( name: "Boxs", columns: table => new { Id = table.Column<string>(type: "TEXT", nullable: false) }, constraints: table => { table.PrimaryKey("PK_Boxs", x => x.Id); }); migrationBuilder.CreateTable( name: "Items", columns: table => new { ItemId = table.Column<string>(type: "TEXT", nullable: false), BoxId = table.Column<string>(type: "TEXT", nullable: false), }, constraints: table => { table.PrimaryKey("PK_Items", x => x.ItemId); table.ForeignKey( name: "FK_Items_Boxs_BoxId", column: x => x.BoxId, principalTable: "Boxs", principalColumn: "Id", onDelete: ReferentialAction.Cascade); });
上下文代码
public class ItemsDbContext : DbContext { public ItemsDbContext(DbContextOptions<ItemsDbContext> options) : base(options) { } public DbSet<Boxs> Boxs { get; set; } public DbSet<Items> Items { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.EnableSensitiveDataLogging(); } protected override void OnModelCreating(ModelBuilder builder) { builder.Entity<Boxs>().HasMany(s => s.Items).WithOne(s => s.Box); } }
内容的提问来源于stack exchange,提问作者whitecpt
相关产品推荐
相关产品推荐

