C# 指定的包含路径无效。EntityType';SpiceShop.Models.Product';不声明名为';产品';
我有一个包含2个表的数据库C# 指定的包含路径无效。EntityType';SpiceShop.Models.Product';不声明名为';产品';,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我有一个包含2个表的数据库 TABLE Categories (CategoriesId, Name, Description) TABLE Products (ProductId, CategoriesId, Title, ProductImageUrl) 类别通过CategoriesId链接到产品 我正在尝试使用LINQ来获得所有特定的标题 public ActionResult Browse(string categories) { var spices = spiceDB
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; }
}
}
名称空间SpiceShop.Models
{
公共类产品
{
[关键]
public int ProductId{get;set;}
公共int分类ID{get;set;}
公共字符串标题{get;set;}
公共字符串ProductImageUrl{get;set;}
公共列表名称{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; }
}
}
名称空间SpiceShop.Models
{
公共类分类
{
[关键]
公共int分类ID{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
//公共列表ProductId{get;set;}
公共列表产品{get;set;}
}
}
只需删除.Include(“产品”),它不是这样使用的
错误很明显,您的“产品”模型中没有“产品”属性。编辑:
看起来您的视图需要一个模型,该模型是“Product”类型的单个对象
此外,我还尝试为每个标识符/变量指定一个最能表达其含义和意图的名称
编辑2: 请注意,更改方法上的任何输入参数名称都需要相应地更改调用该方法的视图代码。
在MVC中,动作方法参数为。
您的调试显示一个URL
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”)
- 您的视图支持所有相关产品,而不仅仅是第一个(即
类型的模型,而不仅仅是列表
)产品
i、 e.使您的产品列表更全面,数据访问代码更简单、更高效。仅为澄清起见,.Include()方法仅用于在您希望通过使用快速加载获取实体的情况下优化性能,而不是延迟加载。这意味着数据库中没有任何具有指定标题的产品。.Single()方法引发此异常,因为它假定始终有一条(并且只有一条)匹配记录。如果您不确定是否会有,请替换.Single for.first,这是因为该序列不包含任何元素。你的表情看起来不对。您的意思可能是.Single(p=>p.Categories.Name==category);由于传递的是类别,我假设这是一个分隔的列表,需要首先解析它。如果我错了,那么您可能应该重命名您的变量,因为它们容易混淆。
var-spices=spiceDB.Products.FirstOrDefault(p=>p.Title.Contains(categories))代码>。我还添加了“Contains”而不是“==”,以防数据库中的行中有空格。这是因为现在查询的结果是“null”(而不是异常)。更改视图以处理此情况(当产品不存在时),向用户显示消息。类似于@if(Model==null){Product not found}或者{@Model.Title}
的内容,您的意思是查询一个实体并包含另一个具有FK关系的实体吗?或者这是Felipe认为的一种误解?如果他的观点是期待一份香料清单,那就是正确的解决方案。我做了一个(可能是错误的)假设,他只想返回一行,因为这正是视图所期望的。@FelipeCastro,我仍然倾向于你对b/c使用single的理解。但是,公平地说,阅读OP的意图需要一个通灵师。有两个表类别(CategoriesId,Name,Description)表产品(ProductId,CategoriesId,Title,ProductImageUrl)类别表名称产品表标题(Product Name details)如果添加此代码,则表示传递到字典中的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery`1[SpiceShop.Models.Product]”,但此字典需要类型为“SpiceShop.Models.Product”的模型项。是否尝试获取具有特定标题的所有产品?或者仅仅是第一个具有特定标题的产品?我对Linq是新手,有两个表类别(CategoriesId、名称、描述)主键CategoriesId表产品(ProductId、CategoriesId、Title、ProductImageUrl)主键ProductId,例如:类别表名称字段数据堇菜和糖浆酱汁腌菜产品表标题字段(类别表名称字段详细信息)
public ActionResult Browse(int categoryId)
{
var products = spiceDB.Products
.Where(p => p.CategoriesId == categoryId)
.ToList();
return View(products);
}