亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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條經驗 獲得超5個贊

我檢查了這個并且它起作用了:


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 關注
  • 364 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號