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

EF Core查询含Owned集合的SendingRules实体触发Collection is read-only错误如何解决?

问题产生原因
  1. 首次报错是因为你将OwnsMany配置绑定到了公开的LBACFilters属性上,该属性返回的是_lbacFilters的只读包装IReadOnlyCollection,EF Core执行查询填充关联数据时,需要调用集合的Add方法写入数据,只读集合不支持写入操作,因此抛出Collection is read-only异常。
  2. 后续修改配置后报错,是因为你将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:06:02