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

Entity Framework如何配置影子拥有实体解决共享表并发令牌报错

EF Core 3.1 共享表Owned实体并发令牌配置方案

报错的核心原因是EF Core要求所有映射到同一张共享表的实体类型(包括嵌套的Owned类型)都必须关联到同一个并发令牌列,否则无法统一识别行版本的归属。

正确配置代码

在DbContext的OnModelCreating方法中添加如下配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 配置基类并发令牌,固定映射到表的ConcurrencyToken列
    modelBuilder.Entity<EntityClass>()
       .Property(e => e.ConcurrencyToken)
       .IsConcurrencyToken()
       .ValueGeneratedOnAddOrUpdate()
       .HasColumnName("ConcurrencyToken");

    // 配置CashTransaction的Owned属性BankAccountCurrency
    modelBuilder.Entity<CashTransaction>()
       .OwnsOne(c => c.BankAccountCurrency, ownedBuilder =>
        {
            // 给Owned实体添加影子并发令牌,映射到同一个全局并发令牌列
            ownedBuilder.Property<byte[]>("ConcurrencyToken")
               .IsConcurrencyToken()
               .ValueGeneratedOnAddOrUpdate()
               .HasColumnName("ConcurrencyToken");

            // 可选:显式指定Owned属性的列名,避免EF自动命名冲突
            ownedBuilder.Property(c => c.CurrencyName)
               .HasColumnName("BankAccountCurrency_CurrencyName");
            ownedBuilder.Property(c => c.CurrencySymbol)
               .HasColumnName("BankAccountCurrency_CurrencySymbol");
        });

    // 同理配置Transaction下的TransactionCurrency Owned属性
    modelBuilder.Entity<Transaction>()
       .OwnsOne(t => t.TransactionCurrency, ownedBuilder =>
        {
            ownedBuilder.Property<byte[]>("ConcurrencyToken")
               .IsConcurrencyToken()
               .ValueGeneratedOnAddOrUpdate()
               .HasColumnName("ConcurrencyToken");
        });
}

关键说明

  • 不需要为Owned类型的每个业务属性单独设置并发令牌,仅需给Owned实体本身添加一个映射到全局ConcurrencyToken列的影子属性即可,所有实体/Owned实体的并发令牌都映射到同一个表字段,不会产生冗余列。
  • 之前的配置错误是因为把BankAccountCurrency错误归属为Transaction的Owned属性,实际上它是派生类CashTransaction的独有属性,归属错误导致配置不生效。
  • 如果存在其他派生类的Owned属性,按照相同模式给每个Owned实体添加指向ConcurrencyToken列的影子属性即可。

内容的提问来源于stack exchange,提问作者Superman.Lopez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:30:01