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; }
}
我收到这个错误:
(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; }
}