Как настроить свойство коллекции только для чтения с полем поддержки в EF Core 2.2 - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь создать класс сущностей, который будет предоставлять связанную коллекцию через свойство только для чтения, например:

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: указанное поле '_relatedEntities' типа 'IList' нельзя использовать для свойства 'MyEntity.RelatedEntities' типа 'IReadOnlyList'.Можно использовать только вспомогательные поля типов, которые можно назначить из типа свойства.

Не могли бы вы привести рабочий пример, как решить эту проблему?

1 Ответ

0 голосов
/ 21 сентября 2019

Сообщение об ошибке громкое и четкое:

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;
    }

Обновите ваш свободный API какследует:

    builder.HasKey(x=>x.Id);
    builder.Metadata.FindNavigation("RelatedEntities")
        .UsePropertyAccessMode(PropertyAccessMode.Field);
...