gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:23:32 25 4
gpt4 key购买 nike

我收到这个错误:

(15,10):错误 3015:从第 6、15 行开始的映射片段出现问题:从表 Beta(Alpha_2、Alpha_1)到表 Alpha(Alpha_1、Alpha_2)的外键约束“Beta_Alpha”::映射不足:在概念方面,外键必须映射到参与外键关联的某些 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 复合主键的一部分这一事实有关。

更新 研究下面 Andrey Molotkov 提供的链接,我从 Beta 的 Alpha 属性中删除了 ForeignKey("Alpha_1, Alpha_2") 属性并尝试在 Fluent API 中显式映射它,但它仍然有完全相同的问题。

该链接的下一个建议是使用 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 属性中指定顺序的方法。

最佳答案

您需要更改 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; }
}

关于entity-framework-6 - Entity Framework 6 反转复合外键的列顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31594304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com