#.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
и правильного построения миграции.