【问题标题】:A specified Include path is not valid. The EntityType 'SpiceShop.Models.Product' does not declare a navigation property with the name 'Products'指定的包含路径无效。 EntityType 'SpiceShop.Models.Product' 未声明名为 'Products' 的导航属性
【发布时间】:2014-10-22 08:37:45
【问题描述】:

我有包含 2 个表的数据库

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

类别通过 CategoriesId 链接到产品。

我正在尝试使用 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; }
    }
}

【问题讨论】:

  • 您的意思是查询一个实体并包含另一个具有 FK 关系的实体吗?还是如 Felipe 所认为的那样,这是一种误解?

标签: c# asp.net-mvc linq


【解决方案1】:

只需删除 .Include("Products"),它不是这样使用的。

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

【讨论】:

  • 为了澄清起见,.Include() 方法应该仅用于在您希望使用 Eager Loading 而不是 Lazy Loading 获取实体的情况下优化性能。
  • 这意味着您的数据库中没有任何具有指定标题的产品。 .Single() 方法会抛出此异常,因为它假定始终存在一个(并且只有一个)匹配记录。如果您不确定是否会有,请将 .Single 替换为 .First
  • 那是因为序列不包含任何元素。你的表情看起来不对。您可能的意思是 .Single(p => p.Categories.Name == category);并且由于您传入类别,我假设这是您需要首先解析的分隔列表。如果我错了,那么您可能应该重命名变量,因为它们会造成混淆。
  • var spices = spiceDB.Products.FirstOrDefault(p =&gt; p.Title.Contains(categories));。我还添加了“包含”而不是“==”,以防万一数据库中的行中有空格。
  • 那是因为现在查询的结果是“null”(而不是异常)。更改您的视图以处理这种情况(当产品不存在时),向用户显示一条消息。类似@if(Model == null) { &lt;h2&gt;Product not found&lt;/h2&gt; } else { &lt;h2&gt; @Model.Title &lt;/h2&gt; }
【解决方案2】:

编辑:

看起来您的视图需要一个“产品”类型的单个对象的模型。

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


编辑 2:

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


所以如果你确实需要将所选类别的名称作为输入参数传递:

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

例如

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

    return View(products);
}

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

【讨论】:

  • 如果他的视图需要一份香料列表,这是正确的解决方案。我做了一个(可能是错误的)假设,即他只想返回一行,因为这是视图所期望的。
  • @FelipeCastro,我仍然倾向于你理解单曲的 b/c 使用。但是,公平地说,阅读 OP 的意图需要通灵者。
  • 有两个表 TABLE Categories (CategoriesId, Name, Description) TABLE Products (ProductId, CategoriesId, Title,ProductImageUrl) Categories Table Name Products Table Title(Product name details) 如果我添加这个代码说传入字典的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery`1[SpiceShop.Models.Product]”,但此字典需要“SpiceShop.Models.Product”类型的模型项。
  • 您是否要获取具有特定标题的所有产品?还是只是第一个具有特定标题的产品?
  • 我是Linq新手,有两个表TABLE Categories(CategoriesId, Name, Description) 主键CategoriesId TABLE Products(ProductId, CategoriesId, Title,ProductImageUrl) 主键ProductId,例如:Categories Table名称 字段数据 Cordials and Syrups Sauces Pickles Products Table Title 字段(类别表名称字段详细信息)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多