C# 传递实体框架查询以查看错误
我刚刚用实体框架代码优先的方法创建了一个数据库 这是我的模态类C# 传递实体框架查询以查看错误,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,localdb,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Localdb,我刚刚用实体框架代码优先的方法创建了一个数据库 这是我的模态类 public class MobileProduct { [Key] public int p_id { get; set; } public string p_name { get; set; } public string p_description { get; set; } public string p_price { get; set; } } 这是我的DbContext派
public class MobileProduct
{
[Key]
public int p_id { get; set; }
public string p_name { get; set; }
public string p_description { get; set; }
public string p_price { get; set; }
}
这是我的DbContext派生类
public class Entities : DbContext
{
public DbSet<MobileProduct> Mobiles { get; set; }
}
这是我的视图
@model HomeShopping.Models.MobileProduct
@{
ViewBag.Title = "Mobiles";
}
<h2>Mobiles</h2>
@model.Models.MobileProduct
@{
ViewBag.Title=“手机”;
}
手机
访问视图时,我遇到一个错误:
传递到字典的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery`1[HomeShopping.Models.MobileProduct]”,但此字典需要类型为“HomeShopping.Models.MobileProduct”的模型项
描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源
异常详细信息:System.InvalidOperationException:传递到字典的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery`1[HomeShopping.Models.MobileProduct]”,但此字典需要类型为“HomeShopping.Models.MobileProduct”的模型项
我猜您想向视图发送MobileProduct列表?若有,;将您的模型更改为
@model IEnumerable<HomeShopping.Models.MobileProduct>
@{
ViewBag.Title = "Mobiles";
}
<h2>Mobiles</h2>
我猜您想向视图发送MobileProduct列表?若有,;将您的模型更改为
@model IEnumerable<HomeShopping.Models.MobileProduct>
@{
ViewBag.Title = "Mobiles";
}
<h2>Mobiles</h2>
您没有实现您的查询,因此您将查询本身而不是查询结果发送到视图
var q = (from n in db.Mobiles
select n).ToList();
return View(q);
正如daveL所说,您还需要更改视图中模型的定义
@model IEnumerable<HomeShopping.Models.MobileProduct>
@model IEnumerable
您没有实现您的查询,因此您将查询本身而不是查询结果发送到视图
var q = (from n in db.Mobiles
select n).ToList();
return View(q);
正如daveL所说,您还需要更改视图中模型的定义
@model IEnumerable<HomeShopping.Models.MobileProduct>
@model IEnumerable
尚未测试,但请尝试将您的模型定义为:
@model IQuerable<HomeShopping.Models.MobileProduct>
尚未测试,但请尝试将模型定义为:
@model IQuerable<HomeShopping.Models.MobileProduct>
您正在将查询保存到q,而不是查询的计算。如果需要多个结果,则需要一个ToList()。将查询保存到q,而不是查询的计算。如果您希望得到多个结果,则需要一个ToList()。问题是什么?问题是什么?您的第二点是正确的,但无论哪种方式,都不需要强制转换到列表。主要的问题是OP向需要单个对象的视图发送枚举。OP仅仅通过强制转换到一个列表就会得到同样的错误,它也可以使用可枚举模型定义直接将可查询对象发送到视图。在我看来,将查询发送到视图是一个非常糟糕的主意,我不希望看到这种模式重复。实现视图,然后发送数据,以防止处理查询的视图(而不是DTO集合)隐藏潜在的昂贵操作。我个人同意,但这不会改变不需要它的事实。说你应该这样做是可以的,但传达必须这样做的信息是不正确的。你的第二点是正确的,但无论哪种方式,都不必使用列表。主要的问题是OP向需要单个对象的视图发送枚举。OP仅仅通过强制转换到一个列表就会得到同样的错误,它也可以使用可枚举模型定义直接将可查询对象发送到视图。在我看来,将查询发送到视图是一个非常糟糕的主意,我不希望看到这种模式重复。实现视图,然后发送数据,以防止处理查询的视图(而不是DTO集合)隐藏潜在的昂贵操作。我个人同意,但这不会改变不需要它的事实。可以这样说,但传达必须这样做的信息是不正确的。没有必要先对列表计算查询。
System.Data.Entity.Infrastructure.DbQuery
实现了IEnumerable
,因此不需要ToList
,但是我的+1是正确的,因为第一部分是正确的。在这个特定的示例中,您不需要求值,但是您不应该在将所有内容发送回视图之前处理您的上下文吗?(已经有一段时间没有使用EF了…@DavidG您只需要对DbQuery求值,因为操作中没有处理上下文。向视图发送查询只会带来麻烦,因为它取决于之前未处理的上下文。这不是一个可靠的模式使用。但从技术上说你是对的;这里并不是严格要求ToList()。@daveL绝对如此,但当您在回答中提到这一点时,最好能解释一下您为什么这样做。前半部分很好地回答了问题,第二部分是很好的实践。不必首先对查询进行列表评估。System.Data.Entity.Infrastructure.DbQuery
实现了IEnumerable
,因此不需要ToList
,但是我的+1是正确的,因为第一部分是正确的。在这个特定的示例中,您不需要求值,但是您不应该在将所有内容发送回视图之前处理您的上下文吗?(已经有一段时间没有使用EF了…@DavidG您只需要对DbQuery求值,因为操作中没有处理上下文。向视图发送查询只会带来麻烦,因为它取决于之前未处理的上下文。这不是一个可靠的模式使用。但从技术上说你是对的;这里并不是严格要求ToList()。@daveL绝对如此,但当您在回答中提到这一点时,最好能解释一下您为什么这样做。前半部分很好地回答了问题,第二部分是良好实践。