EF Core查询含Owned集合的SendingRules实体触发Collection is read-only错误如何解决?
问题产生原因
- 首次报错是因为你将
OwnsMany配置绑定到了公开的LBACFilters属性上,该属性返回的是_lbacFilters的只读包装IReadOnlyCollection,EF Core执行查询填充关联数据时,需要调用集合的Add方法写入数据,只读集合不支持写入操作,因此抛出Collection is read-only异常。 - 后续修改配置后报错,是因为你将
OwnsMany绑定到了私有字段_lbacFilters,同时又单独配置了公开属性LBACFilters的导航,EF Core无法识别这两个成员的关联关系,认为存在两个未配置的导航属性,因此抛出无法确定关系的异常。
解决方案
保留你的实体封装逻辑(外部只能通过AddLBACFilter方法修改集合,公开属性只读),通过Fluent API显式指定导航属性的 backing field,让EF Core直接操作私有字段读写数据,避免触碰只读的公开包装属性,配置如下:
builder .OwnsMany( sendingRule => sendingRule.LBACFilters, ownedBuilder => { ownedBuilder.ToTable("SendingRuleLBACFilters"); ownedBuilder.WithOwner() .HasForeignKey("SendingRulesId"); }) // 指定公开导航对应的私有 backing field .HasField("_lbacFilters") // 配置EF Core读写时优先使用字段,不调用公开属性的setter/getter .UsePropertyAccessMode(PropertyAccessMode.Field);
该配置兼容EF Core 3.0及以上版本,无需修改实体定义,完全保留你原本的封装逻辑。
内容的提问来源于stack exchange,提问作者Bassie
相关产品推荐
相关产品推荐

