Entity Framework Core 5.0 Ссылка на требуемый атрибут навигации миграция не работает

#.net-core #entity-framework-core #ef-code-first #entity-framework-migrations

#.net-ядро #entity-framework-core #ef-code-first #entity-framework-миграции

Вопрос:

Мы только недавно обновили 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 — мой вопрос в том, почему?

Я прочитал документацию по последним изменениям здесь и документацию по связям здесь, которая, по-видимому, указывает на то, что функциональность изменилась, но, похоже, не в этом конкретном сценарии? При добавлении TemplateId свойства ( int? ) с RequiredAttribute включенным в него — миграция работает должным образом, и в TemplateId столбце ничего не меняется.

Кажется, я что-то упускаю или не совсем понимаю документацию — буду признателен за любую помощь!

Комментарии:

1. Это звучит как ошибка, подумайте о том, чтобы опубликовать ее в своем трекере проблем GitHub.

Ответ №1:

Чтобы решить проблему, я добавил свойство в Template класс —

 public virtual List<Document> Documents { get; set ; }
 

Казалось, это дало инструментам EF то, что было необходимо для обнаружения RequiredAttribute и правильного построения миграции.