为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 EF Core 2.2 中使用支持字段设置只读集合属性

如何在 EF Core 2.2 中使用支持字段设置只读集合属性

C#
摇曳的蔷薇 2023-12-17 10:41:13
我正在尝试创建一个实体类,它将通过只读属性公开相关集合,如下所示:public class MyEntity: Entity{    public int Id{ get; private set; }    private IList<RelatedEntity> _relatedEntities = new List<RelatedEntity>();    public IReadOnlyList<RelatedEntity> RelatedEntities => _relatedEntities.ToList().AsReadOnly();}构建器类如下所示:public void Configure(EntityTypeBuilder<MyEntity> builder){    builder.HasKey(x=>x.Id);    builder.Property<IReadOnlyList<RelatedEntity>>("RelatedEntities")        .HasField("_relatedEntities ")        .UsePropertyAccessMode(PropertyAccessMode.Field);}它可以构建,但在运行时崩溃,但有以下例外:InvalidOperationException:指定字段“_latedEntities”;类型为“IList”;不能用于属性“MyEntity.RelatedEntities”类型为“IReadOnlyList”。只能使用可从属性类型分配的类型的支持字段。您能提供一个如何处理这个问题的工作示例吗?
查看完整描述

4 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

我检查了这个并且它起作用了:


private readonly List<RelatedEntity> _relatedEntitys;

public IReadOnlyCollection<RelatedEntity> RelatedEntitys => _relatedEntitys;

并且配置必须如下所示:


    builder.HasMany(x => x.RelatedEntitys)

        .WithOne()

        .IsRequired()

        .HasForeignKey(x => x.RelatedEntityId)

        .OnDelete(DeleteBehavior.Cascade);


    builder.Metadata

        .FindNavigation("RelatedEntitys")

        .SetPropertyAccessMode(PropertyAccessMode.Field);


查看完整回答
反对 回复 2023-12-17
?
aluckdog

TA贡献1847条经验 获得超7个赞

EF core 要求您使用具体类型作为支持字段。您需要将代码更改为:

private readonly List<RelatedEntity> _relatedEntities = new List<RelatedEntity>();
public IReadOnlyList<RelatedEntity> RelatedEntities => _relatedEntities.ToList();


查看完整回答
反对 回复 2023-12-17
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

错误消息响亮而清晰:


IList 不可分配给 IReadOnlyList


将属性类型更改为与支持字段相同的类型即可解决问题。


更新:

因为 IEnumerable<T> 默认情况下是只读的,我相信这将是您最好的选择。


    public class MyEntity: Entity

    {

        public int Id { get; private set; }


        private readonly List<RelatedEntity> _relatedEntities = _collection.ToList().AsReadOnly();


        public IEnumerable<RelatedEntity> RelatedEntities => _relatedEntities;

    }

按如下方式更新您的 Fluent API:


    builder.HasKey(x=>x.Id);

    builder.Metadata.FindNavigation("RelatedEntities")

        .UsePropertyAccessMode(PropertyAccessMode.Field);


查看完整回答
反对 回复 2023-12-17
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

对于 EF Core 2,我相信支持字段必须是 HashSet<T> 类型才能被框架正确识别,因此这应该有效:

public class MyEntity {
  private HashSet<RelatedEntity> _relatedEntities = new HashSet<RelatedEntity>();  
  public IReadOnlyCollection<RelatedEntity> RelatedEntities => _relatedEntities;
}
查看完整回答
反对 回复 2023-12-17
  • 4 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信