Я пытаюсь реализовать ненулевые ссылочные типы в моем проекте https://dev.to/integerman/safer-code-with-c-8-non-null-reference-types-4f2c. Мне это нравится, но у меня есть вопрос, касающийся моделей и ограничений базы данных.
Можно ли сказать, что значение X никогда не равно NULL, потому что в базе данных оно не может быть пустым?
Например:
public class Person
{
public int Id { get; set; };
public string Name { get; set; } = "No name set";
public IEnumerable<Dog> Dogs { get; set; } = new List<Dog>();
}
Person.Name в базе данных имеет значение nullable = false. Есть ли способ сказать, что это свойство никогда не равно нулю? Теперь я должен установить значение по умолчанию.
public class Dog
{
public int Id { get; set; }
public string Name { get; set; } = "Noname";
public int PersonId {get; set; }
public Person Person { get; set; }
}
Здесь мне интересно то же самое о Person from Dog. Это ограничение внешнего ключа в базе данных, Собака не может существовать без Человека (владельца). Есть ли способ сказать это; Я знаю, что это значение никогда не бывает пустым, поверьте мне или что-то в этом роде?
[Обновление]
Есть ли способ сказать, что значение X никогда не равно NULL, потому что оно не обнуляется в базе данных?
Да, см. ответ Павла Аниховского
Если вы сделаете это:
Нет, см. ответ TomTom
Лучшее решение, я думаю, это @ canton7 последний комментарий. Он ссылается на это; https://docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non -nullable-properties-and-initialization
Другая причина:
public IEnumerable<Dog> Dogs { get; set; } = new List<Dog>();
Если вы пытаетесь получить такого человека, как это:
var person = _dbcontext.persons.Single(x => x.Name == "John").ToList();
Console.log($"John has {person.Dogs.Count} dogs")
Это будет выдавать 0 каждый раз, потому что мы забыли .Include (x => x.dogs). Так что это неправильно.