实体框架中的自我关系

时间:2014-02-24 00:49:50

标签: c# database entity-framework

我需要在我的应用程序中代表一个英雄联盟项目(后来我想以这里的方式显示它们:

http://lol.gameguyz.com/sites/default/files/Item%20Shop_Recommended%20Items_FollowUp%20(1).jpg

右边是

即作为树结构)。请注意,每个项目可能都包含用于构建它的项目列表。

我已经实现了应用程序的第一个版本,现在我正在努力将数据移动到数据库。我想了解一下Entity Framework。首先使用代码,我已经宣布了我的课程:

public class Item
{
    public ItemID ID { get; set; }
    public int Cost { get; set; }
    public string Name { get; set; }
    public string Path { get; set; }
    public List<ItemID> Recipe { get; set; }


    public Item() { }

    public Item(ItemID id, int cost, string name,
                string path, List<ItemID> recipe)
    {
        ID = id;
        Cost = cost;
        Name = name;
        Path = path;
        Recipe = recipe;
    }
}

但是在当前形状中它根本不包含有关配方的信息(即生成的数据库只有4列 - ID,成本,名称和路径。 由于这是一个0 ... n关系,在传统的SQL数据库中,我需要创建一个具有SuperiorItem-ItemUsedToBuild对的新表。使用EF有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

过了一会儿,我设法找到了解决问题的方法 - 这就是:

public class Item
{
    public int ID { get; set; }
    public int Cost { get; set; }
    public string Name { get; set; }
    public string Path { get; set; }

    public virtual List<Item> Recipe { get; set; }
}

然后在上下文定义中,需要定义关系。与在LoL中一样,项目可以构建许多其他子项,并且可以被许多其他项目用作成分,这是多对多关系。因此上下文将如下所示:

class DataContext : DbContext
{
    public DbSet<Item> Items { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Item>()
            .HasMany(item => item.Recipe)
            .WithMany();
    }
}

在数据库端创建了两个表 - 一个用于存储有关项的信息,另一个用于保存项之间关系的信息。