使用实体框架lambda表达式检查与联结表的多对多关系中的相关数据

时间:2016-12-12 14:20:21

标签: asp.net-mvc entity-framework lambda

这是与连接表的简单多对多关系: simple many to many relation with junction table

我如何首先使用实体​​框架数据库检索产品的相关类别?

我为此目的使用此sql查询:

SQL查询:

SELECT Products.*, Categories.Title
FROM Products, Products_Categories, Categories
WHERE (Products.ID = Products_Categories.Product_ID AND Products_Categories.Category_ID = Categories.ID)

这个等效的 lambda表达式是什么?

经过大量研究后,我尝试了以下代码:

HomeController中的C#:

products = oDB.Products.Include(m => m.Products_Categories.Select(a => a.Category))
                       .ToList();

之后,我应该使用以下方法之一访问产品类别标题:

// i and j are indices
string title = products[i].Products_Categories.Select(x => x.Category).ToList()[j].Title;
string title_0 = products[i].Products_Categories.ToList()[j].Category.Title;

此代码的问题在于,当我将产品对象传递给视图时,我无法访问该类别:

return View(products);

我正在寻找这样的代码:

在.cshtml文件中:

@model List<olomrayanehDB.Product>
...
@item.Products_Categories.Category.Title // ERROR! this is not working for many to many relations, but I know there's almost the same way coding for one to many relations.

总之,我如何将产品对象传递给视图,其中包含所有相关数据,例如类别的标题? (我知道一对多关系的解决方案,这里的问题是多对多关系与联结表

1 个答案:

答案 0 :(得分:0)

不确定为什么您的对象不会被填充,但是:

你不需要有Product_Categories。您可以让EF将其直接映射到Products中的Category列表。

modelBuilder.Entity<Product>()
            .HasMany<Category>(s => s.Categories)
            .WithMany(c => c.Products)
            .Map(cs =>
                    {
                        cs.MapLeftKey("ProductId");
                        cs.MapRightKey("CategoryId");
                        cs.ToTable("Product_Category");
                    });