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
相关产品推荐
相关产品推荐

