2014-11-21 42 views
0

我是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,因爲我認爲這個方法肯定會工作。任何幫助將非常感激。謝謝。

+0

好的,從上下文中刪除了ManageTasksViewModel,即使它自己在那裏神奇地出現了,哈哈。仍然沒有運氣,有沒有人知道鏈接到實體初學者的好消息,我現在要下載'LINQ for Dummies',不要開玩笑! – 2014-11-22 18:18:46

回答

2

你不應該在你的dbcontext中有一個視圖模型。這只是一個viewModel,與你的實體完全不同。

public System.Data.Entity.DbSet<FRESH.ViewModel.ManageTasksViewModel> 
     ManageTasksViewModels { get; set; } 
+0

詳細說明,哈希表示要從DbContext中刪除此行。 – 2014-11-21 22:09:24

0

感謝所有那些誰給了他們的時間來幫助我在此,基本上我再次去了Contoso大學教程,並得到這個問題的答案,基本上它是可笑類似於我第一次嘗試,但我嘗試着。

選擇新的ManageTasksViewModel { 。 。 。 };

而我應該說的;

選擇新的ManageTasksViewModel() { 。 。 。 }

 
    public class ManageTasksController : Controller 
    { 
     private FRESHContext db = new FRESHContext(); 

     // GET: ManageTasks 
     public ActionResult Index() 
     { 

      IQueryable<ManageTasksViewModel> query = from tasks in db.Tasks 
                join users in db.Users on tasks.UserId equals users.UserId 
                select new ManageTasksViewModel() 
                { 
                 TaskId = tasks.TaskId, 
                 UserId = users.UserId, 
                 FullName = users.FullName, 
                 Title = tasks.Title, 
                 Description = tasks.Description, 
                 StartDate = tasks.StartDate, 
                 EndDate = tasks.EndDate 
                }; 
      return View(query.ToList()); 
     } 

無論如何,希望這對某人有用。