2012-07-11 100 views
4

在MVC項目中,如果我在Model中插入LINQ查詢,是否違反了MVC模式?MVC模型中的數據庫查詢

namespace DocLibrary.Models 
{ 
    public class Author 
    { 
     private DocLibraryContext db = new DocLibraryContext(); 

     [Key] 
     public Int32 AuthorId { get; set; } 

     [StringLength(20)] 
     public String Name { get; set; } 

     .. 

     public string GetNameById(int AuthorId) 
     { 
      var query = from a in db.Author 
         where a.AuthorId == AuthorId 
         select a.Name; 

      return query.FirstOrDefault(); 
     } 


     public Author GetAuthorById(int AuthorId) 
     { 
      var query = from a in db.Author 
         where a.AuthorId.Equals(AuthorId) 
         select a; 

      return query.FirstOrDefault(); 
     } 
    } 

或者我應該將這些方法(GetNameByIdGetAuthorById)來控制?

回答

6

在MVC項目中,如果我將LINQ查詢放入模型中,是否違背了MVC模式?

不,這不是對MVC模式。數據庫查詢在模型中非常好。顯然,應明確區分型號和要傳遞給你的意見視圖模型之間進行。視圖模型不應該包含任何數據庫特定的東西。

或者我應該將這些方法(GetNameById,GetAuthorById)移動到控制器?

絕對不是。控制者的責任不是查詢數據庫。控制器的責任是交談的模型,建立一個視圖模型,並通過該視圖模型的視圖。控制器甚至不應該知道數據庫是什麼。

1

爲ASP.NET MVC應用程序構建模型時,始終使用存儲庫模式是一種很好的做法,以便DAL層容易根據需要進行更改和測試。當您使用庫模式,您創建一個包含所有與約束你的數據庫訪問邏輯凝乳獨立的存儲設備類。

當我們創建repository類,我們創建了一個代表所有由repository類所使用的方法的接口。在控制器中,我們根據接口而不是存儲庫編寫代碼。

1

使用這樣

internal IQueryable<Table1> GetArmyList2() 
    { 
     //var lists = from list in db.Table1 
       // select list; 

     //return lists; 


     var query = from Table1 in db.Table1 
        where Table1.Username.Equals("asik") & Table1.Password.Equals("asik") 
        select Table1; 

     return query; 


    } 

和控制器代碼

public ActionResult asik() 
    { 
     var armyList = cl.GetArmyList2(); 
     return View(armyList); 
     // return View(); 
    }