繁体   English   中英

Entity Framework Fluent API中的两个FK

[英]Two FKs in Entity Framework Fluent API

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

[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; }
}

这为我设置的测试表提供了结果: 在此处输入图片说明

暂无
暂无

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

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