具有外键的数据库模型的 C# 8 非空引用类型
C# 8 Non-Null Reference Types for Database models with foreign key
我正在尝试在我的项目中实现非空引用类型 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; }
}
这里我也想知道来自狗的人。这是数据库中的外键约束,没有人(所有者)就不能存在狗。有没有办法这么说? 我知道这个值永远不会为 null 相信我 或类似的东西吗?
[更新]
有没有办法说明值 X 永远不会为 NULL,因为它在数据库中不可为空?
是的,请参阅 Pavel Anikhouski 的回答
你应该这样做吗:
没有,看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)。
所以错了。
不,这没有任何意义。特别是在数据库实体领域——您必须允许 null,否则您无法在不自动加载相关对象的情况下加载对象。这最终会迫使您加载大量您可能不需要的简单查询数据。
狗可以没有人而存在。不在数据库级别,但我可以要求提供所有狗的列表,此时对所有者不感兴趣。
你可以使用 null forgiving operator !
public Person Person { get; set; } = default!;
正如评论中指出的那样,您应该谨慎使用它,因为它适用于任何类型(值或引用类型)并且您也可以使用 null!
我正在尝试在我的项目中实现非空引用类型 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; }
}
这里我也想知道来自狗的人。这是数据库中的外键约束,没有人(所有者)就不能存在狗。有没有办法这么说? 我知道这个值永远不会为 null 相信我 或类似的东西吗?
[更新]
有没有办法说明值 X 永远不会为 NULL,因为它在数据库中不可为空?
是的,请参阅 Pavel Anikhouski 的回答
你应该这样做吗:
没有,看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)。 所以错了。
不,这没有任何意义。特别是在数据库实体领域——您必须允许 null,否则您无法在不自动加载相关对象的情况下加载对象。这最终会迫使您加载大量您可能不需要的简单查询数据。
狗可以没有人而存在。不在数据库级别,但我可以要求提供所有狗的列表,此时对所有者不感兴趣。
你可以使用 null forgiving operator !
public Person Person { get; set; } = default!;
正如评论中指出的那样,您应该谨慎使用它,因为它适用于任何类型(值或引用类型)并且您也可以使用 null!