2

我有三个表:ItemsCategoryjunction 表CategoryItems。项目和类别具有多对多关系。

CategoryItems 具有三列Category_IdItem_IdPosition

如何使用PositionEntity Framework 对我的项目进行排序?

我正在使用这个模型构建器:

modelBuilder
.Entity<Category>()
.HasMany(c => c.Items)
.WithMany();
4

2 回答 2

4

CategoryItems如果您的联结表 ( ) 在关系的每一端(在本例中为 )的外键上有附加列,则EF 不支持映射多对多关系Position。您将需要创建另一种类型(例如CategoryItem)并将您的映射配置为与此类型的两个一对多关系。

在这种情况下,您的CategoryItem类型都将具有(例如)CategoryItem集合,并且CategoryItem类型将具有CategoryandItem属性。

因此,要获取按位置排序的类别的项目列表,您可以执行以下操作:

var category = context.Categories.Find(categoryId);
var orderedItems = 
    category.CategoryItems.OrderBy(ci => ci.Position).Select(ci => ci.Item);

您可能想要选择一个比 更好的名称CategoryItem,因为虽然这是一个描述联结表的好名称,纯粹是为了建模多对多关系,但在您的情况下,它实际上本身就是一个实体。

于 2012-08-26T14:59:07.350 回答
1

我最终使用它来加载类别项目:

 public IEnumerable<Item> Items
    {
        get
        {
            using (var context = new CatalogueContext())
            {
                var ids = context.Database.SqlQuery<int>("SELECT Item_Id FROM CategoryItems WHERE Category_Id = " +
                                                         this.Id + " ORDER BY Position");
                foreach (int id in ids)
                    yield return context.Items.Find(id);

            }
        }
    } 

然后使用 SQL 查询来更改位置。

于 2012-08-26T15:52:46.950 回答