посмотреть модель с IList добавить данные не удалось - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть модель представления. DetailViewModel содержит один IList для модели вспомогательного представления EntryDetailViewModel.

public class DetailViewModel
{
    [NotMapped]
    [JsonIgnore]
    private IList<EntryDetailViewModel> _entries;

    [JsonIgnore]
    public new IList<EntryDetailViewModel> Entries
    {
        get
        {
            if (_entries == null)
                _entries = new List<=EntryDetailViewModel>();

            return _entries.Where(m => !m.Deleted).ToList();
        }
        set => _entries = value;
    }
}

Моя проблема заключается в том, что при добавлении EntryDetailViewModel entryDetailModel в коллекцию коллекция просто остается count = 0.

detailModel.Entries.Add(entryDetailModel);

enter image description here

Есть идеи? Это потому, что entryDetailModel на данный момент не имеет идентификатора, поэтому его нельзя добавить? Или что это может быть?

Дополнительная информация

Я попытался запросить существующий DetailViewModel dvm1 и существующую EntryDetailViewModel из другого DetailViewModel, чтобы добавить в dvm1, также не удалось. Означает ли это, что я не могу добавить модель вида в другую модель вида?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Спасибо Стиву Пай за то, что он указал на то, что вызывал model.entries.add (entry), всегда будет вызывать геттер, в результате чего каждый раз будет возвращаться новый список.

Однако решение всегда будет возвращать новый список модели представления при запросе и сопоставлении. Мой оригинальный код не публикует эту проблему, поэтому я объединил их вместе, добавив функцию AddEntry, которая не будет запускать геттер и все еще сможет запрашивать все необходимые данные. Мое решение ниже.

[AutoMap(typeof(Manifest), ReverseMap = true)]
public class ViewModel
{
    ......other stuff

    [NotMapped]
    [JsonIgnore]
    private IList<EntryViewModel> _entries;

    [JsonIgnore]
    public virtual IList<EntryViewModel> Entries
    {
        get
        {
            if (_entries == null)
                _entries = new List<EntryViewModel>();

            return _entries.Where(m => !m.Deleted).ToList();
        }
        set => _entries = value;
    }

    public void AddEntry(EntryViewModel entry)
    {
        _entries.Add(entry);
    }
}

[AutoMap(typeof(Manifest), ReverseMap = true)]
public class DetailViewModel : ViewModel
{
    ......other stuff

    [NotMapped]
    [JsonIgnore]
    private IList<EntryDetailViewModel> _entries;

    [JsonIgnore]
    public new IList<EntryDetailViewModel> Entries
    {
        get
        {
            if (_entries == null)
                _entries = new List<EntryDetailViewModel>();

            return _entries.Where(m => !m.Deleted).ToList();
        }
        set => _entries = value;
    }

    public void AddEntry(EntryDetailViewModel entry)
    {
        _entries.Add(entry);
    }
}
0 голосов
/ 07 февраля 2020

Нет, это не сработает.

Когда вы звоните:

detailModel.Entries.Add(entryDetailModel);

Это вызывает Getter для ваших записей, который делает это:

return _entries.Where(m => !m.Deleted).ToList();

_entries может быть установлен на новый List<Entry>, однако, возвращая .Where(...).ToList(), получатель вернет недавно инициализированный список , содержащий только не удаленные записи. Вы добавляете к этому временному списку результатов, а не _entries.

Если вы хотите, чтобы ваши получатели фильтровали только невыбранные строки, это нормально, но вы должны рассмотреть более подход DDD:

[NotMapped]
[JsonIgnore]
private IList<EntryDetailViewModel> _entries = new List<EntryDetailViewModel>();

[JsonIgnore]
public new IReadOnlyList<EntryDetailViewModel> Entries
{
    get
    {
        return _entries.Where(m => !m.Deleted).ToList().AsReadOnly();
    }
}

public void AddEntry(EntryDetailViewModel entry)
{
    // TODO: Validate entry doesn't already exist, is complete/valid...
    // then...

    _entries.Add(entry);
}

Для наборов сбора полезно инициализировать их при создании, чтобы избежать необходимости в дополнительной дополнительной плите котла для проверки на нулевую или конструкторскую инициализацию. Затем получатель помечается как ReadOnlyList (или ReadOnlyCollection), который возвращает ваши отфильтрованные данные. Использование вариантов ReadOnly не требуется, но оно дает вашим будущим потребителям, по крайней мере, предупреждение о том, что «Эй, вы не должны пытаться изменить эту коллекцию». DDD включает предоставление подходящих методов добавления / обновления / удаления, чтобы регулировать, когда и как можно изменить состояние этого объекта. Для этой коллекции нет Setter, поэтому он не может быть перезаписан каким-то мошенническим кодом, добавленным позже. Это включает в себя планирование методов, которые будут служить действиями, регулирующими изменение состояния, а не полагаться на установщики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...