繁体   English   中英

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

[英]A specified Include path is not valid. The EntityType 'SpiceShop.Models.Product' does not declare a navigation property with the name 'Products'

我有包含2个表的数据库

TABLE Categories (CategoriesId, Name, Description)
TABLE Products (ProductId, CategoriesId, Title, ProductImageUrl)

类别通过CategoriesId链接到Products。

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

 public ActionResult Browse(string categories)
 {
     var spices = spiceDB.Products.Include("Products").Single(p => p.Title == categories);                 
     return View(spices);
 }

产品型号

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; }
    }
}

分类模型

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; }
    }
}

只需删除.Include(“Products”),这不是它的使用方式。

错误很明显,“产品”模型中没有“产品”属性。

编辑:

看起来您的View需要一个Model为“Product”类型的单个对象。

此外,我试图给每个标识符/变量一个最能传达其含义和意图的名称。


编辑2:

请注意,更改方法上的任何输入参数名称都需要在调用该方法的View代码中进行相应的更改。
在MVC中,Action-Method参数会自动映射
您的调试显示一个Browse?categories=Sauces的URL,它自动映射到方法“Browse”,输入参数categories设置为“Sauces”。 但是(我的版本)Browse方法需要categoryName参数,而不是categories 因此,您需要确保URL属性和方法参数具有完全相同的名称。


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

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,而不是“Pickles”)
  • 您的View支持所有相关产品,而不仅仅是第一个产品(即List<Product>类型的模型,而不仅仅是Product

例如

public ActionResult Browse(int categoryId)
{
    var products = spiceDB.Products
        .Where(p => p.CategoriesId == categoryId) 
        .ToList();

    return View(products);
}

即使您的产品列表更加全面,您的数据访问代码更简单,更高效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM