处理 Net 6 的可空和 Entity Framework 实体
Deal with in Net 6's nullable and Entity Framework entities
使用 Net 6 和 Entity Framework 我有以下实体:
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!;
我也可以添加构造函数,但并非所有属性(例如,导航属性)都可以在构造函数中。
最好的方法是什么?
几天前我遇到了同样的事情,实际上 .net 5 中也有可为 null 的引用类型,但我们必须手动将其添加到 .csproj 中,而对于 .net 6,它默认存在。
我采取了以下方法。
如果我知道我的 属性 是不可为 null 的,并且当迁移生成时它应该为 nullable false 那么我就这样说。
public string CountryCode { get; set;} = null!; // This indicate that this property will have value eventually. so no warning generate during compilation.
当我知道 属性 可以在数据库或迁移中包含 null 和 nullable = true 时
public string? CountryCode {get;set;}
就个人而言,我只是将这一行放在我所有模型文件(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.
删除最后一行并将第一行剪切到文件的顶部。
使用 Net 6 和 Entity Framework 我有以下实体:
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!;
我也可以添加构造函数,但并非所有属性(例如,导航属性)都可以在构造函数中。
最好的方法是什么?
几天前我遇到了同样的事情,实际上 .net 5 中也有可为 null 的引用类型,但我们必须手动将其添加到 .csproj 中,而对于 .net 6,它默认存在。
我采取了以下方法。
如果我知道我的 属性 是不可为 null 的,并且当迁移生成时它应该为 nullable false 那么我就这样说。
public string CountryCode { get; set;} = null!; // This indicate that this property will have value eventually. so no warning generate during compilation.
当我知道 属性 可以在数据库或迁移中包含 null 和 nullable = true 时
public string? CountryCode {get;set;}
就个人而言,我只是将这一行放在我所有模型文件(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.
删除最后一行并将第一行剪切到文件的顶部。