实体框架Fluent API中的两个FK

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架Fluent API中的两个FK相关的知识,希望对你有一定的参考价值。

我正在努力连接两个非常简单的表:

[Table("Item")]
public class Item
{
    [Key]
    [Column("itemId", TypeName = "int")]
    public int ItemId { get; set; }
}

[Table("LinkedItems")]
public class LinkedItem
{
    [Key]
    [Column("itemId", TypeName = "int")]
    public int ItemId { get; set; }

    [Column("parentItemId", TypeName = "int")]
    public int ParentItemId { get; set; }
}

LinkedItem表中有两个外键:

  1. itemId,指向桌子Item展示自己
  2. parentItemId,指向表Item显示其父母

我想完成这样的事情:

[Table("Item")]
public class Item
{
    [Key]
    [Column("itemId", TypeName = "int")]
    public int ItemId { get; set; }

    public ICollection<LinkedItem> ChildItems { get; set; }
    public LinkedItem LinkedItem { get; set; }
}

[Table("LinkedItems")]
public class LinkedItem
{
    [Key]
    [Column("itemId", TypeName = "int")]
    public int ItemId { get; set; }

    [Column("parentItemId", TypeName = "int")]
    public int ParentItemId { get; set; }

    public Item Item { get; set; }
    public Item ParentItem { get; set; }
}

我成功创建了从Item到LinkedItem的连接:

modelBuilder.Entity<Item>().HasOptional(i => i.LinkedItem).WithRequired(i => i.Item);

但我不能添加另一个连接。你能帮我解决这两个表的Fluent API配置吗?

答案

此时不需要LinkedItem类。你可以用一个类完成这个。

public class Item
{
    public int Id { get; set; }

    public int ParentItemId { get; set; }

    public virtual Item ParentItem { get; set; }

    public virtual ICollection<Item> ChildItems { get; set; }
}

        modelBuilder.Entity<Item>()
            .HasRequired(entity => entity.ParentItem)
            .WithMany(entity => entity.ChildItems)
            .HasForeignKey(entity => entity.ParentItemId);

否则只需添加:

modelBuilder.Entity<Item>()
    .HasMany(entity => entity.ChildItems)
    .WithRequired(entity => entity.ParentItem)
    .HasForeignKey(entity => entity.ParentItemId);

编辑:扩展答案。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Item>()
        .HasOptional(entity => entity.LinkedItem)
        .WithRequired(entity => entity.Item);

    modelBuilder.Entity<Item>()
        .HasMany(entity => entity.ChildItems)
        .WithRequired(entity => entity.ParentItem)
        .HasForeignKey(entity => entity.ParentItemId);
}

[Table("Item")]
public class Item
{
    [Key]
    public int ItemId { get; set; }

    public virtual ICollection<LinkedItem> ChildItems { get; set; }

    public virtual LinkedItem LinkedItem { get; set; }
}

[Table("LinkedItem")]
public class LinkedItem
{
    [Key]
    public int ItemId { get; set; }

    public int ParentItemId { get; set; }

    public virtual Item Item { get; set; }

    public virtual Item ParentItem { get; set; }
}

这让我得到了我设置的测试表的结果:enter image description here

以上是关于实体框架Fluent API中的两个FK的主要内容,如果未能解决你的问题,请参考以下文章

一对一或零对一实体框架代码优先 Fluent Api

实体框架(CTP5、Fluent API)。重命名导航属性的列

实体框架代码优先 - Fluent Api 与数据注释的优缺点 [关闭]

我是不是需要使用 Fluent API 配置与实体框架的关系的双方?

是否可以在实体框架中将表FK链接到另外两个PK?

使用实体框架 Fluent Api 映射 System.Uri