首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指定的包含路径无效。EntityType 'SpiceShop.Models.Product‘没有声明名为'Products’的导航属性

指定的包含路径无效。EntityType 'SpiceShop.Models.Product‘没有声明名为'Products’的导航属性
EN

Stack Overflow用户
提问于 2013-02-28 08:56:44
回答 2查看 16.7K关注 0票数 3

我有一个包含2个表的数据库

代码语言:javascript
复制
TABLE Categories (CategoriesId, Name, Description)
TABLE Products (ProductId, CategoriesId, Title, ProductImageUrl)

类别通过CategoriesId链接到产品。

我正在尝试使用LINQ来获取特定标题的所有内容。

代码语言:javascript
复制
 public ActionResult Browse(string categories)
 {
     var spices = spiceDB.Products.Include("Products").Single(p => p.Title == categories);                 
     return View(spices);
 }

产品型号

代码语言:javascript
复制
namespace SpiceShop.Models
{
    public class Product
    {
        [Key]
        public int ProductId { get; set; }

        public int CategoriesId { get; set; }
        public string Title { get; set; }

        public string ProductImageUrl { get; set; }
        public List <Categorie> Name { get; set; }
    }
}

类别模型

代码语言:javascript
复制
namespace SpiceShop.Models
{
    public class Categorie
    {
        [Key]
        public int CategoriesId { get; set; }
        public string Name  { get; set; }

        public string Description { get; set; }
        //public List<Product> ProductId { get; set; }
        public List<Product> Products { get; set; }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-28 09:18:26

编辑:

看起来你的视图需要一个Model,它是一个"Product“类型的单一对象。

此外,我还尝试为我的每个标识符/变量指定一个最能表达其含义和意图的名称。

编辑2:

请注意,更改方法上的任何输入参数名称都需要对调用该方法的View代码进行相应的更改。

在MVC中,动作方法的参数是automatically mapped

您的调试程序显示了一个Browse?categories=Sauces的URL,它自动映射到方法"Browse“,并将输入参数categories设置为"Sauces”。但是(我的版本) Browse方法需要一个categoryName参数,而不是categories参数。因此,您需要确保URL属性和方法参数具有完全相同的名称。

因此,如果您确实需要将所选类别的名称作为输入参数传递:

代码语言:javascript
复制
public ActionResult Browse(string categoryName)
{
    // Gets the CategoryId for the given categoryName, or zero if not found.
    var categoryId = spiceDB.Categories
        .Where(c => c.Name == categoryName)
        .Select(c => c.CategoriesId)
        .FirstOrDefault();

    // Gets the first Product (only) for the specified categoryId.
    var firstProduct = category.Products
        .FirstOrDefault(p => p.CategoriesId == categoryId);

    return View(firstProduct);
}

然而,支持这种类型的“父-子”关系的更常见的使用场景是:

当单击类别列表时,视图将按ID调用查询,而不是按名称查询(即3,not "Pickles")

  • Your
  • 支持所有相关产品,而不仅仅是第一个)(即,不只是List<Product>类型的模型

例如:

代码语言:javascript
复制
public ActionResult Browse(int categoryId)
{
    var products = spiceDB.Products
        .Where(p => p.CategoriesId == categoryId) 
        .ToList();

    return View(products);
}

例如,使您的产品列表更全面,使您的数据访问代码更简单和更有效。

票数 4
EN

Stack Overflow用户

发布于 2013-02-28 09:00:35

只要删除.Include("Products")就可以了,这不是它的用法。

错误很明显,您的"Product“模型中没有"Products”属性。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15125540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档