Entity Framework 6 反转复合外键的列顺序

Entity Framework 6 inverting column order for composite foreign keys

我收到这个错误:

(15,10):错误 3015:映射片段从第 6、15 行开始出现问题:来自 table Beta 的外键约束 'Beta_Alpha'(Alpha_2、Alpha_1) 到 table Alpha (Alpha_1, Alpha_2):: 映射不充分:外键必须映射到概念上参与外键关联的某些 AssociationSet 或 EntitySet。

关键信息是Beta中的复合外键(Alpha_2、Alpha_1)的列是倒置的,Alpha_2在前,Alpha_1在后。这似乎是 Entity Framework.

中的错误

以下是实体:

public class Alpha
{
    [Key, Column(Order = 1)]
    public string Alpha_1 { get; set; }
    [Key, Column(Order = 2)]
    public string Alpha_2 { get; set; }
}

public class Beta
{
    [Key, Column(Order = 1)]
    public string Beta_1 { get; set; }
    [Key, Column(Order = 2)]
    public string Alpha_2 { get; set; }
    [Required]
    public string Alpha_1 { get; set; }

    [ForeignKey("Alpha_1, Alpha_2")]
    public virtual Alpha Alpha { get; set; }
}

请注意,Beta 中的 ForeignKey 属性正确地首先列出 Alpha_1。

这是生成的迁移:

public partial class Test : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.Betas",
            c => new
                {
                    Beta_1 = c.String(nullable: false, maxLength: 128),
                    Alpha_2 = c.String(nullable: false, maxLength: 128),
                    Alpha_1 = c.String(nullable: false, maxLength: 128),
                })
            .PrimaryKey(t => new { t.Beta_1, t.Alpha_2 })
            .ForeignKey("dbo.Alphas", t => new { t.Alpha_2, t.Alpha_1 }, cascadeDelete: true)
            .Index(t => new { t.Alpha_2, t.Alpha_1 });

        CreateTable(
            "dbo.Alphas",
            c => new
                {
                    Alpha_1 = c.String(nullable: false, maxLength: 128),
                    Alpha_2 = c.String(nullable: false, maxLength: 128),
                })
            .PrimaryKey(t => new { t.Alpha_1, t.Alpha_2 });

    }

    public override void Down()
    {
        DropForeignKey("dbo.Betas", new[] { "Alpha_2", "Alpha_1" }, "dbo.Alphas");
        DropIndex("dbo.Betas", new[] { "Alpha_2", "Alpha_1" });
        DropTable("dbo.Alphas");
        DropTable("dbo.Betas");
    }
}

即使我手动更新迁移,我仍然会收到错误,因为内部模型本身正在反转列。

该错误似乎与 Alpha_2 也是 Beta 复合主键的一部分有关。

Update 研究下面 Andrey Molotkov 提供的 link,我从 Beta 的 Alpha 属性 中删除了 ForeignKey("Alpha_1, Alpha_2") 属性并且试图在 Fluent API 中明确映射它,但它仍然有完全相同的问题。

link 的下一个建议是使用 Column 属性显式设置顺序。我认为这就抓住了问题的症结所在。我有一个 属性、Alpha_2,它参与了一个复合主键和一个复合外键,所以我必须能够独立地指定每个键的顺序。

public class Beta
{
    [Key, Column(Order = 1)]
    public string Beta_1 { get; set; }
    [Key, Column(Order = 2), ForeignKey("Alpha"), Column(Order = 1)]
    public string Alpha_2 { get; set; }
    [Required, ForeignKey("Alpha"), Column(Order = 2)]
    public string Alpha_1 { get; set; }

    public virtual Alpha Alpha { get; set; }
}

但这会导致错误,因为 Column 属性只能出现一次。

我认为 EF 需要一种方法来直接在 Key 或 ForeignKey 属性中指定 Order。

您需要更改 Beta 个外键列的顺序:

public class Beta
{
    [Key, Column(Order = 1)]
    public string Beta_1 { get; set; }
    [Key, Column(Order = 3), ForeignKey("Alpha")]
    public string Alpha_2 { get; set; }
    [Required, ForeignKey("Alpha"), Column(Order = 2)]
    public string Alpha_1 { get; set; }

    public virtual Alpha Alpha { get; set; }
}