Entity Framework 核心 5.0 参考导航 RequiredAttribute + 迁移不工作
Entity Framework Core 5.0 Reference Navigation RequiredAttribute + Migration not working
我们最近刚刚将一个 ASP.NET 核心项目升级到 5.0,所有 Entity Framework (nuget) 升级可用 - 将其全部升级到最新的 5.0 版本。
创建新的迁移时,似乎带有 [Required]
属性的参考导航 属性 不再导致迁移将列创建为 NOT NULL
。
我们的代码(注意Template
参考导航属性):
/// <summary>
/// A document is a completed template
/// </summary>
public class Document
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int? Id { get; set; }
[Required]
public string Name { get; set; }
public int CompanyRecId { get; set; }
public int AgreementRecId { get; set; }
/// <summary>
/// A HistoryId is common to all documents copied from an original document.
/// Thus;
/// - A document is created via a template
/// - A second document is created by the original document.
/// - The two documents are linked by the same GroupId.
/// </summary>
[Required]
public Guid HistoryId { get; set; }
[Required]
public string Creator { get; set; }
[Required]
public DateTime Created { get; set; }
[Required]
public virtual Template Template { get; set; }
...构造函数,方法如下
创建迁移时(例如Add-Migration Update17
),生成以下(Up
)代码:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Documents_Templates_TemplateId",
table: "Documents");
migrationBuilder.AlterColumn<int>(
name: "TemplateId",
table: "Documents",
type: "int",
nullable: true,
oldClrType: typeof(int),
oldType: "int");
migrationBuilder.AddForeignKey(
name: "FK_Documents_Templates_TemplateId",
table: "Documents",
column: "TemplateId",
principalTable: "Templates",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
TemplateId
列正在从之前的 nullable: false
更改为 nullable: true
- 我的问题是为什么?
我已阅读重大更改文档 here and the relationships documentation here,它似乎表明功能已更改,但在这种特定情况下似乎没有?
添加带有 RequiredAttribute
的 TemplateId
属性 (int?
) 时 - 迁移按预期工作并且 TemplateId
列没有任何变化。
我似乎遗漏了什么或没有清楚地理解文档 - 任何帮助将不胜感激!
为了解决这个问题,我在 Template
class -
上添加了 属性
public virtual List<Document> Documents { get; set ; }
这似乎为 EF 工具提供了检测 RequiredAttribute
和正确构建迁移所需的内容。
我们最近刚刚将一个 ASP.NET 核心项目升级到 5.0,所有 Entity Framework (nuget) 升级可用 - 将其全部升级到最新的 5.0 版本。
创建新的迁移时,似乎带有 [Required]
属性的参考导航 属性 不再导致迁移将列创建为 NOT NULL
。
我们的代码(注意Template
参考导航属性):
/// <summary>
/// A document is a completed template
/// </summary>
public class Document
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int? Id { get; set; }
[Required]
public string Name { get; set; }
public int CompanyRecId { get; set; }
public int AgreementRecId { get; set; }
/// <summary>
/// A HistoryId is common to all documents copied from an original document.
/// Thus;
/// - A document is created via a template
/// - A second document is created by the original document.
/// - The two documents are linked by the same GroupId.
/// </summary>
[Required]
public Guid HistoryId { get; set; }
[Required]
public string Creator { get; set; }
[Required]
public DateTime Created { get; set; }
[Required]
public virtual Template Template { get; set; }
...构造函数,方法如下
创建迁移时(例如Add-Migration Update17
),生成以下(Up
)代码:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Documents_Templates_TemplateId",
table: "Documents");
migrationBuilder.AlterColumn<int>(
name: "TemplateId",
table: "Documents",
type: "int",
nullable: true,
oldClrType: typeof(int),
oldType: "int");
migrationBuilder.AddForeignKey(
name: "FK_Documents_Templates_TemplateId",
table: "Documents",
column: "TemplateId",
principalTable: "Templates",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
TemplateId
列正在从之前的 nullable: false
更改为 nullable: true
- 我的问题是为什么?
我已阅读重大更改文档 here and the relationships documentation here,它似乎表明功能已更改,但在这种特定情况下似乎没有?
添加带有 RequiredAttribute
的 TemplateId
属性 (int?
) 时 - 迁移按预期工作并且 TemplateId
列没有任何变化。
我似乎遗漏了什么或没有清楚地理解文档 - 任何帮助将不胜感激!
为了解决这个问题,我在 Template
class -
public virtual List<Document> Documents { get; set ; }
这似乎为 EF 工具提供了检测 RequiredAttribute
和正确构建迁移所需的内容。