Entity Framework Core 5中显式配置Owned仍被识别为非Owned如何解决
错误原因
该报错的核心是EF Core检测到对CreditCard实体的冲突配置:
- 你通过
modelBuilder.Entity<JobSeeker>().OwnsMany(a => a.CreditCards);将CreditCard标记为JobSeeker的从属(Owned)实体 - 同时存在两个将
CreditCard识别为独立实体的操作:- 在DbContext中声明了单独的
DbSet<CreditCard>,EF Core会默认将对应类型识别为可独立操作的非Owned实体 - 在
OnModelCreating中直接调用modelBuilder.Entity<CreditCard>()做配置,该操作也会触发EF Core将其判定为非Owned实体
两种配置互斥,因此抛出异常。
- 在DbContext中声明了单独的
解决方案
根据你的业务需求选其中一种方案修改即可:
方案一:保留CreditCard为Owned从属实体
Owned实体不能脱离所属的JobSeeker独立存在,也无需单独查询CreditCard时使用该方案:
- 删除DbContext中
public DbSet<CreditCard> CreditCards { get; set; }这行声明 - 将
CreditCard的关联配置移动到OwnsMany的配置块中,替换原来的两行关联配置:
modelBuilder.Entity<JobSeeker>().OwnsMany(a => a.CreditCards, cardBuilder => { cardBuilder.HasOne(o => o.CardType).WithMany().HasForeignKey("_creditCardTypeID"); });
- 删除原来单独写的
modelBuilder.Entity<CreditCard>().HasOne(...)那行配置。
方案二:将CreditCard改为独立实体
如果需要单独管理、查询CreditCard,不需要用Owned特性,使用该方案:
- 删除
modelBuilder.Entity<JobSeeker>().OwnsMany(a => a.CreditCards);这行配置 - 新增普通一对多关联配置即可,原来的
CreditCard的DbSet和单独配置无需修改:
modelBuilder.Entity<JobSeeker>().HasMany(a => a.CreditCards).WithOne().HasForeignKey("JobSeekerId"); // 你原来的CreditCard配置可以保留 modelBuilder.Entity<CreditCard>().HasOne(o => o.CardType).WithMany().HasForeignKey("_creditCardTypeID");
内容的提问来源于stack exchange,提问作者Mike Lenart
相关产品推荐
相关产品推荐

