如何将视图模型与 LINQ to Entities 一起使用
Posted
技术标签:
【中文标题】如何将视图模型与 LINQ to Entities 一起使用【英文标题】:How to Use a View Model with LINQ to Entities 【发布时间】:2014-11-21 17:59:54 【问题描述】:我是 ASP.NET MVC 的新手,但我似乎无法理解有关视图模型的规则。我在这里展示的示例绝对类似于来自各种来源的其他示例,所以我完全糊涂了。
我在 VS 2013 MVC 5 上使用 Code First With Entity Framework 6,并创建了以下两个模型。
public class Task
public int TaskId get; set;
public int UserId get; set;
public String Title get; set;
public String Description get; set;
public DateTime StartDate get; set;
public DateTime EndDate get; set;
public virtual User User get; set;
public class User
public int UserId get; set;
public String UserName get; set;
public String Password get; set;
public String FullName get; set;
public String Email get; set;
public String Status get; set;
public String Role get; set;
public virtual ICollection<Task> Tasks get; set;
这是我的上下文。
public class FRESHContext : DbContext
public DbSet<User> Users get; set;
public DbSet<Task> Tasks get; set;
public DbSet<Artefact> Artefacts get; set;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
public System.Data.Entity.DbSet<FRESH.ViewModel.ManageTasksViewModel> ManageTasksViewModels get; set;
现在看到用户和任务之间存在一对多的关系,我想列出任务,显示分配给他们的用户(嗯,这“只是”一个学习示例),所以我认为这会受益于设计一个特殊的视图模型来强类型到视图页面并使用 LINQ to Entities 查询来派生模型以发送到视图页面。这是与强类型视图页面一起使用的视图模型。
public class ManageTasksViewModel
public int TaskId get; set;
public int UserId get; set;
public String FullName get; set;
public String Title get; set;
public String Description get; set;
public DateTime StartDate get; set;
public DateTime EndDate get; set;
别担心,我已经正确地强输入了如下视图页面;
@model IEnumerable<FRESH.ViewModel.ManageTasksViewModel>
@
ViewBag.Title = "Index";
<h2>Index</h2>
<p>
@html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.UserId)
</th>
<th>
@Html.DisplayNameFor(model => model.FullName)
</th>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
etc etc .............(with brevity in mind lol.)
所以现在我创建了一个 LINQ to Entities 查询,我看了之后觉得这很合理,哦,我不知道一千个视频,哈哈。
public class ManageTasksController : Controller
private FRESHContext db = new FRESHContext();
// GET: ManageTasks
public ActionResult Index()
var query = (from U in db.Users
join T in db.Tasks on U.UserId equals T.UserId
select new ManageTasksViewModel
TaskId = T.TaskId,
UserId = U.UserId,
FullName = U.FullName,
Title = T.Title,
Description = T.Title,
StartDate = T.StartDate,
EndDate = T.EndDate
).Take(10).ToList();
return View("Index",query);
当然它建立了! yeehaar!,但是当代码到达 ActionResult Index() 时,我得到了这个异常。
An exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll but was not handled in user code
Additional information: The entity or complex type 'FRESH.DAL.ManageTasksViewModel' cannot be constructed in a LINQ to Entities query.
那么我做错了什么,我还能用另一种方式做得更好吗,我没有研究过 LINQ to SQL,因为我认为这种方法肯定会奏效。任何帮助将非常感激。谢谢。
【问题讨论】:
好的,从 Context 中删除了 ManageTasksViewModel,尽管它自己神奇地出现在那里,哈哈。仍然没有运气,有没有人知道链接到实体的初学者的好来源,我现在要下载'LINQ for Dummies',不是开玩笑! 【参考方案1】:您的 dbcontext 中不应有视图模型。这只是一个视图模型,与您的实体完全不同。
public System.Data.Entity.DbSet<FRESH.ViewModel.ManageTasksViewModel>
ManageTasksViewModels get; set;
【讨论】:
详细说明,Hash 是说要从你的 DbContext 中删除这一行。【参考方案2】:感谢所有在这方面花时间帮助我的人,基本上我再次阅读了 Contoso 大学教程并得到了答案,基本上它与我的第一次尝试非常相似,只是我在尝试。
选择新的 ManageTasksViewModel . . . ;
而我应该说的是;
选择新的 ManageTasksViewModel() . . .
公共类 ManageTasksController : 控制器 私有 FRESHContext db = new FRESHContext(); // GET: 管理任务 公共行动结果索引() IQueryable无论如何希望这对某人有用。
【讨论】:
以上是关于如何将视图模型与 LINQ to Entities 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
这是如何运作的? LINQ to Entities 触发程序集的加载?
使用 TPH 和复杂类型时 LINQ to Entities 的初始性能问题,Pregen 视图似乎啥都不做?