处理 Net 6 的可为空和实体框架实体 [关闭]
Posted
技术标签:
【中文标题】处理 Net 6 的可为空和实体框架实体 [关闭]【英文标题】:Deal with in Net 6's nullable and Entity Framework entities [closed] 【发布时间】:2021-11-22 16:04:37 【问题描述】:使用 Net 6 和实体框架我有以下实体:
public class Address
public Int32 Id get; set;
public String CountryCode get; set;
public String Locality get; set;
public Point Location get; set;
public virtual Country Country get; set;
public virtual ICollection<User> Users get; set; = new List<User>();
在项目定义中使用 <Nullable>enable</Nullable>
我收到警告:
Non-nullable property '...' must contain a non-null value when exiting constructor. Consider declaring the property as nullable.
在地址属性中:
CountryCode, Locality, Location and Country.
我看到了一些解决这个问题的方法:
public String? CountryCode get; set;
public String CountryCode get; set; = null!;
我也可以添加一个构造函数,但并非所有属性(例如导航属性)都可以在构造函数中。
最好的方法是什么?
【问题讨论】:
documentation 显示了一些可能性。但我同意,这不是最重要的。 【参考方案1】:就我个人而言,我只是将这一行放在我所有模型文件(POCO/JSON 模型、DbContext 等)的顶部:
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
只需将该行放在文件顶部即可,无需restore
。
还有一个"official" solution,但太可怕了:
public Product Product get; set; = null!;
文档确实将我的解决方案列为有效,但您不需要为每个属性重复它。
使用 VS 时如何创建该行的提示:
你会得到这样的东西:
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
public TestContext(DbContextOptions options) : base(options)
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
删除最后一行并将第一行剪切到文件顶部。
【讨论】:
【参考方案2】:几天前我遇到了同样的事情,实际上可空引用类型也存在于 .net 5 中,但我们必须手动将其添加到 .csproj 中,而 .net 6 默认情况下存在。
我采取了以下方法。
如果我知道我的属性是不可为空的,并且在迁移生成时它应该具有可空的 false,那么我就这样说。
public string CountryCode get; set; = null!; // This indicate that this property will have value eventually. so no warning generate during compilation.
当我知道属性可以在 db 或迁移中包含 null 和 nullable = true 时
public string? CountryCode get;set;
【讨论】:
我认为在使用 EF 迁移时使用“public string? CountryCode get;set;
或 public string CountryCode get; set; = null!;
无关紧要。实体配置中的内容就是应用的内容。我错了吗?
相关。 string
导致不可为空的字段(必需),而string?
允许空值。至少对于 SQLite 和 SQL Server。
部分正确。意味着如果您明确提供设置,那很好,但如果您只添加 builder.Property(x=>x.Countrycode)。此时可为空的引用类型发挥作用,生成像可空列或不可空列一样的迁移。
@dotnetstep 好的,我在我的实体 Fluent 配置中将 Required
设置为 true
或 false
,因此实体的流畅配置似乎覆盖了属性是否可以为空。
以上是关于处理 Net 6 的可为空和实体框架实体 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章