实体框架核心:具有订单的多对多表

时间:2020-08-23 19:12:41

标签: entity-framework-core many-to-many

我有两个对象表和一个连接表,如下所示:

public class Item
{
    public int ItemID
    public ICollection<ItemAttribute> ItemAttributes
}

public class Attribute
{
    public int AttributeID
    public ICollection<ItemAttribute> ItemAttributes
    public AttributeType Type
    public int ValueID
}

public class ItemAttribute
{
    public int ItemID;
    public Item Item
    public int AttributeID;
    public Attribute Attribute
    public int? Order
}

在我的OnCreateModelBuilding函数中,我具有以下内容:

        modelBuilder.Entity<Item>()
            .HasKey(i => i.ItemID);

        modelBuilder.Entity<Attribute>()
            .HasKey(a => a.AttributeID);

        modelBuilder.Entity<ItemAttribute>()
            .HasKey(ia => new { ia.ItemID, ia.AttributeID });
        modelBuilder.Entity<ItemAttribute>()
            .HasOne<Item>(ia => ia.Item)
            .WithMany(i => i.ItemAttributes)
            .HasForeignKey(ia => ia.ItemID);
        modelBuilder.Entity<ItemAttribute>()
            .HasOne<Attribute>(ia => ia.Attribute)
            .WithMany(a => a.ItemAttributes)
            .HasForeignKey(ia => ia.AttributeID);

虽然我知道示例和教程中看到的大多数联接表都没有Order列,但我希望有一个。这是我要尝试做的一个例子。

想象一下,我保存了一个“班级图片”项目,并且想按顺序(从左到右)列出该图片中的学生。就表格而言,这就是我的想法:

Items
ItemID
1

Attributes
AttributeID     Type          ValueID
1               Student       1
2               Student       2
3               Student       3

ItemAttribute
ItemID          AttributeID        Order
1               3                  1
1               1                  2
1               2                  3

在此示例中,将使用ValueID指向从StudentRepository中提取学生信息。理想情况下,我想将属性添加到项,而不是相反。因此,我在Item类中具有以下功能:

    public bool AddAttribute(Attribute attribute, int? order)
    {
        ItemAttribute itemAttribute = new ItemAttribute() { Item = this, Attribute = attribute, Order = order != null ? order : null };

        if (ItemAttributes.Contains(itemAttribute))
            return false;

        ItemAttributes.Add(itemAttribute);

        return ItemAttributes.Contains(itemAttribute);
    }

这是处理此问题的最佳方法吗?

0 个答案:

没有答案