我是ASP.NET MVC的新手,但似乎無法理解有關View Models的規則。我在這裏展示的例子絕對類似於各種來源的其他例子,所以我完全使用了flumuxed。如何在LINQ to Entities中使用視圖模型
我在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,因爲我認爲這個方法肯定會工作。任何幫助將非常感激。謝謝。
好的,從上下文中刪除了ManageTasksViewModel,即使它自己在那裏神奇地出現了,哈哈。仍然沒有運氣,有沒有人知道鏈接到實體初學者的好消息,我現在要下載'LINQ for Dummies',不要開玩笑! – 2014-11-22 18:18:46