Каковы наилучшие методы реализации свойства навигации «многие» в EF Core

Таким образом, у меня есть растущее количество моделей баз данных, использующих List<T> для своих «многих» навигационных свойств. Пример может быть таким:

public class ResourceType
{
    public int ResourceTypeId { get; set; }
    public string Name { get; set; }
    public List<Resource> Resources { get; set; }
}

Я читал о хороших привычках при работе с С#, чтобы никогда не возвращать null, а не пустой список. Я могу придумать пару способов добиться этого.

public List<Resource> Resources { get; set; } = new List<Resource>();

или, возможно, даже выполнив:

private List<Resource> _Resources { get; set; }
public List<Resource> Resources {
    get {
        if (_Resources == null) {
            _Resources = new List<Resource> ();
        }
        return _Resources;
    }
    set {
        _Resources = value;
    }
}

В других местах люди рекомендуют использовать ICollection<T>, и как можно предотвратить возврат null?

Между тем, эмпирическое правило при разработке моделей EF заключается в том, что модель должна максимально точно представлять таблицу. Нарушает ли это правило какой-либо из приведенных выше примеров?

Все это приводит меня к одному вопросу: как лучше всего обращаться с этим типом собственности? Какой тип следует использовать и следует ли предотвратить возврат null? и что лучше всего предотвратить в такой ситуации?


person rasmus91    schedule 17.02.2018    source источник


Ответы (1)


Мой ответ состоял бы в том, чтобы сделать это следующим образом:

public ICollection<Resource> Resources { get; set; } = new List<Resource>();

И относительно типа. Вероятно, вам не следует использовать List в качестве объявленного типа свойства, я бы сказал, что наилучшей практикой является объявление этих свойств с помощью интерфейсов (в какой-то момент вы можете изменить фактический класс экземпляра). Кроме того, не выставляйте больше методов в список/коллекцию/перечислитель, чем вам абсолютно необходимо. В большинстве случаев подходит ICollection или IEnumerable.

person Fredrik Rudberg    schedule 17.02.2018