首页 > 解决方案 > EF Core 导航到父类问题的 2 个属性

问题描述

我正在我创建的一个新类上运行迁移,其中有 2 个对象引用相同类型的不同对象。这是课程

public class AccountOpenerWorkflowStep 
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        public DateTime CreatedDate { get; set; }
        public DateTime ModifiedDate { get; set; }
        public string Controller { get; set; }
        public string Action { get; set; }
        public bool DefaultStep { get; set; }

        [Column("TrueWorkflowStepId")]
        public virtual AccountOpenerWorkflowStep TrueWorkflowStep { get; set; }

        [Column("FalseWorkflowStepId")]
        public virtual AccountOpenerWorkflowStep FalseWorkflowStep { get; set; }
    }

所以我的两个属性TrueWorkflowStepFalseWorkflowStep指向同一张表中的其他对象。

问题是当我运行此迁移时,它只创建列FalseWorkflowStep而不是 True 。

这是迁移中的一个例外

migrationBuilder.CreateTable(
            name: "AccountOpenerWorkflowSteps",
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                    .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn),
                CreatedDate = table.Column<DateTime>(nullable: false),
                ModifiedDate = table.Column<DateTime>(nullable: false),
                Controller = table.Column<string>(nullable: true),
                Action = table.Column<string>(nullable: true),
                DefaultStep = table.Column<bool>(nullable: false),
                FalseWorkflowStepId = table.Column<int>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_AccountOpenerWorkflowSteps", x => x.Id);
                table.ForeignKey(
                    name: "FK_AccountOpenerWorkflowSteps_AccountOpenerWorkflowSteps_False~",
                    column: x => x.FalseWorkflowStepId,
                    principalTable: "AccountOpenerWorkflowSteps",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.SetNull);
            });

如您所见,它仅插入同一类型的一列。

谁能告诉我为什么它不能识别这两列?

标签: c#asp.net-coreentity-framework-coreef-core-2.0

解决方案


[Column]属性在这里不合适,因为它应该应用于原始属性,而不是引用。EF 只是忽略属性(使用不同的列名证实了这一点),回退到其默认映射约定——然后失败。

我昨天偶然发现了一个类似的问题。EF 的默认约定似乎很难在一个类中处理两个统一的关系。

我没有在 Npgsql 中尝试您的模型,但是使用 Sql Server EF 也同样失败。解决方案是使用正确的属性:

[ForeignKey("TrueWorkflowStepId")]
public virtual AccountOpenerWorkflowStep TrueWorkflowStep { get; set; }

[ForeignKey("FalseWorkflowStepId")]
public virtual AccountOpenerWorkflowStep FalseWorkflowStep { get; set; }

或流畅的映射:

modelBuilder.Entity<AccountOpenerWorkflowStep>().HasOne(x => x.TrueWorkflowStep).WithMany()
    .HasForeignKey("TrueWorkflowStepId").IsRequired(false);
modelBuilder.Entity<AccountOpenerWorkflowStep>().HasOne(x => x.FalseWorkflowStep).WithMany()
    .HasForeignKey("FalseWorkflowStepId").IsRequired(false);

推荐阅读