You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:15:21