Два FK в Entity Framework Свободный 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 для этих двух таблиц?

1 ответ

Решение

Класс 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; }
}

Это дает мне результаты с тестовыми таблицами, которые я настроил:

Другие вопросы по тегам