C# 8 ненулевых ссылочных типов для моделей баз данных с внешним ключом - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь реализовать ненулевые ссылочные типы в моем проекте 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). Так что это неправильно.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

Нет, и это не имеет смысла. Особенно в области объектов базы данных - вы ДОЛЖНЫ разрешить null, потому что в противном случае вы не можете загрузить объект без автоматической загрузки связанного объекта. Что в конечном итоге заставит вас загружать много данных, которые вам могут не понадобиться для простого запроса.

Собаки МОГУТ существовать без Person. Не на уровне БД, но я могу попросить список всех собак и не интересоваться владельцами на данный момент.

1 голос
/ 17 февраля 2020

Для этого вы можете использовать оператор нулевого прощения !

public Person Person { get; set; } = default!;

Как указано в комментариях, его следует осторожно использовать, поскольку он работает с любым типом (значением или ссылка 1) и вы также можете использовать null!

...