【问题标题】:String is not nullable by default in Entity Framework Core 6.0默认情况下,Entity Framework Core 6.0 中的字符串不可为空
【发布时间】: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


【解决方案1】:

只需要删除 .csproj 文件上的这一行 enter image description here

【讨论】:

    猜你喜欢
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多