繁体   English   中英

具有两个外键的实体框架关系

[英]Entity Framework relationship with two foreign keys

我在FluentAPI中连接两个表时遇到问题。 实际上,它是FluentAPI和数据注释的混合。 我看着这个问题,但没有帮助我。 我尝试使用Index ,它由唯一键组成。

基本上, Foo是主表。 Bar桌是可选的。 通过两列连接。 key1key2对是唯一的。 将其视为父子关系,但有一个限制,即1个父母只能生育1个孩子:

数据实体看起来像这样:

[Table("foo")]
public class Foo
{
    [Key]
    [Column("pk", TypeName = "int")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int FooId { get; set; }

    [Column("key1", TypeName = "int")]
    public int Key1 { get; set; }
    [Column("key2", TypeName = "int")]
    public int Key2 { get; set; }

    public Bar Bar { get; set; }
}

[Table("bar")]
public class Bar
{
    [Key]
    [Column("key1", TypeName = "int", Order = 1)]
    public int Key1 { get; set; }
    [Key]
    [Column("key2", TypeName = "int", Order = 2)]
    public int Key2 { get; set; }

    public Foo Foo { get; set; }
}    

这是我尝试连接它们的方式:

modelBuilder.Entity<Bar>().HasRequired(p => p.Foo).WithOptional(p => p.Bar);

怎么了? Bar确实需要Foo Foo有可选的Bar <---这应该足够了,因为FooBar具有与主键完全相同的命名方式。 但这是行不通的。

所以我尝试指定外键:

modelBuilder.Entity<Bar>().HasRequired(p => p.Foo).WithOptional(p => p.Bar).Map(p => p.MapKey(new[] { "key1", "key2" }));

它说:

“指定的列数必须与主键列数匹配”

哇啊 怎么样? 怎么会? 嗯..

我也尝试过:

modelBuilder.Entity<Bar>().HasIndex(table => new { table.Key1, table.Key2 });  

所以我的问题是:

  1. 为什么我的解决方案不起作用? 我确实指定了复杂的密钥

  2. 我该怎么打呢?

这将有点复杂,在这里我可能完全错了,但是从我的经验来看,EntityFramework关系并不是那样。 在我看来,如果Foo是必需的,而Bar是可选的 ,则每个Bar应该有一种基于Foo的pk值唯一地返回到Foo的方法。

也就是说,Bar应该定义为:

[Table("bar")]
public class Bar
{
    [Key]
    [Column("key1", TypeName = "int", Order = 1)]
    public int Key1 { get; set; }
    [Key]
    [Column("key2", TypeName = "int", Order = 2)]
    public int Key2 { get; set; }
    public int FooId { get; set; }

    public Foo Foo { get; set; }
}    

然后,您需要在关系描述中使用此FooId,而不是Bar中包含的组合键。 EntityFramework一直要求我加入父POCO的整个主键,该主键必须是子POCO的外键。 您可能仍然可以通过子键在LINQ查询中加入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM