【发布时间】:2022-06-23 14:23:19
【问题描述】:
我在 Entity Framework Core 6.0 中创建了一个数据库表。我在我的项目中使用代码优先方法。
TestModel 中有一个名为 Address 的字符串类型属性。
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace TestProjectForCore6.Models
{
public class TestModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Address { get; set; }
}
}
当我为此模型添加迁移时,它会在迁移构建器中创建一个 nullable false 列:
在 Entity Framework Core 5.0 中,我们不需要添加显式定义字符串属性为可为空。
【问题讨论】:
-
这是因为 net6 项目默认情况下在项目级别默认打开了名为 NRT 的(愚蠢的)MS 东西,并且所有 MS 产品,包括 EF Core 都被推送来支持它,而不是真正的所需的功能并修复其错误。请参阅Working with Nullable Reference Types,但如果您问我,请尽可能在项目级别关闭它们。
-
它对我有用,先生。
-
@IvanStoev 但是先生,关闭项目的 NRT 有什么缺点吗?
-
就我个人而言,不(显然来自我之前的评论)。你只是在 NRT 之前得到了行为,而 NRT 只不过是编译器警告,并不能保证在运行时不能得到空值。
-
我知道一开始的警告可能会很痛苦,但是当你习惯它们并以正确的方式解决它们之后,你的应用程序会好很多。所以要清楚,如果它不能为空,就给它字符串。否则使 ik 可以为空。选项 1 公共字符串地址 { 获取;设置;} = 空!;或公共字符串地址? {get;set;} 如果添加 = null!它告诉编译器最终不会为空。迁移后生成的代码如下所示: [Address] nvarchar(max) NOT NULL,
标签: c# entity-framework-core ef-code-first entity-framework-migrations ef-core-6.0