Join EF 4.1复杂关系的实体映射

Join EF 4.1复杂关系的实体映射,join,entity-framework-4.1,ef-code-first,Join,Entity Framework 4.1,Ef Code First,我想先用EF 4.1代码映射以下表格: 项目-可以有多个类别的项目 ItemCategories—映射ItemsCategories的多对多关系的关系表 类别-一个类别,类别是一个类别树,ParentId是自引用 CategoryLink-此表包含树的边 问题是如何为我的实体类创建EF代码优先映射,以便我可以使用项上的Categories集合属性,同时能够使用查询中的所有表(尤其是关系表上的联接),如下所示: //searchIds contains a list of category gu

我想先用EF 4.1代码映射以下表格:

项目-可以有多个类别的项目

ItemCategories—映射ItemsCategories的多对多关系的关系表

类别-一个类别,类别是一个类别树,ParentId是自引用

CategoryLink-此表包含树的边


问题是如何为我的实体类创建EF代码优先映射,以便我可以使用项上的Categories集合属性,同时能够使用查询中的所有表(尤其是关系表上的联接),如下所示:

//searchIds contains a list of category guids to be searched for inside the category tree
var query = from item in db.Items
            join itemCategory in db.ItemCategories on item.Id equals itemCategory.ItemId
            join category in db.Categories on itemCategory.CategoryId equals category.Id
            join categoryLink in db.CategoryLinks on category.Id equals categoryLink.ChildId
            where searchIds.Contains(categoryLink.ParentId)
            select item;
以下是带有DbContext的实体类(不带映射)

类TestContext:DbContext
{
公共数据库集类别{get;set;}
公共数据库集项{get;set;}
公共数据库集ItemCategories{get;set;}
公共数据库集类别链接{get;set;}
}
公共类项目
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection类别{get;set;}
}
公共类ItemCategory
{
公共Guid ItemId{get;set;}
公共Guid类别ID{get;set;}
}
公共类类别
{
公共Guid Id{get;set;}
公共Guid?父ID{get;set;}
公共虚拟类别父项{get;set;}
公共字符串名称{get;set;}
}
公共类类别链接
{
公共Guid ParentId{get;set;}
公共Guid ChildId{get;set;}
公共虚拟类别父项{get;set;}
公共虚拟类别子{get;set;}
}

谢谢

我只是先玩了一下代码,不确定这是否有用。但是下面的文章展示了如何创建桥接表,以及如何首先解决EF4.1代码中的多对多问题


我只在代码方面做了一些尝试,不确定这是否有帮助。但是下面的文章展示了如何创建桥接表,以及如何首先解决EF4.1代码中的多对多问题


这些帖子都不是关于我问的话题。第二个问题甚至不是关于代码优先。我的问题是如何显式映射关系表(能够与之连接,同时仍然能够将ICollection引用映射为on Item)。这些帖子都不是关于我问的主题。第二个问题甚至不是关于代码优先,我的问题是如何显式映射关系表(能够与之连接,同时仍然能够将ICollection引用映射为on项)。
class TestContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Item> Items { get; set; }
    public DbSet<ItemCategory> ItemCategories { get; set; }
    public DbSet<CategoryLink> CategoryLinks { get; set; }
}

public class Item
{
    public Guid Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Category> Categories { get; set; }
}

public class ItemCategory
{
    public Guid ItemId { get; set; }
    public Guid CategoryId { get; set; }
}

public class Category
{
    public Guid Id { get; set; }

    public Guid? ParentId { get; set; }
    public virtual Category Parent { get; set; }

    public string Name { get; set; }
}

public class CategoryLink
{
    public Guid ParentId { get; set; }
    public Guid ChildId { get; set; }

    public virtual Category Parent { get; set; }
    public virtual Category Child { get; set; }
}