2012-03-21 92 views
1

我想給部分類中的一個LTS對象添加一個新的構造函數。它應該從數據庫中返回對象的一個​​實例。基本上,這個想法是獲取LINQ-TO-SQL對象的方法

public Questionnaire(int id) 
{ 
    this = (from q in db.Questionnaires 
      where q.Id == id 
      select q).SingleOrDefault(); 
} 

我就可以進入每個屬性,並將其設置爲返回的對象,但是這似乎是矯枉過正,如果我改變我的數據庫模式,我必須確保我編輯該代碼。

那麼這樣做的最佳做法是什麼?我無法使用靜態方法,因爲DataContext將無法跟蹤對該對象所做的任何更改。

我需要創建一個新的類實例,然後調用該類的GET方法嗎?即

public Questionnaire Get(int id) 
{ 
    return (from q in db.Questionnaires 
      where q.Id == id 
      select q).SingleOrDefault(); 
} 

然後用它

​​

回答

2

您可以嘗試跟隨在他的博客post由Mike哈德洛建議的執行情況。

基本上你會做的是在充當特定類型對象的存儲庫的類中實現檢索邏輯(和其他操作)(在你的情況 - 問卷調查中)。

這將是類似如下

var rep = new Repository<Questionnaire>(...); 

var questionnaire = rep.GetById(1); 
+0

這是相當不錯的概念和替代解決我的問題。想看看我想要實現的是否可能。 – Marko 2012-03-21 23:08:33

+0

從我的角度來看,您應該避免使用第一種解決方案,因爲您正在構造函數中創建一個新對象,並將其分配給保存所創建對象的變量。有點奇怪。 至於第二個,它是有效的,買你試圖封裝邏輯到你的域對象。這個邏輯應該屬於你的數據的某種存儲庫(因此是模式的名稱)。 – foliveira 2012-03-21 23:20:21

+0

我發佈的第一個選項只是試圖解釋我想實現的目標。我明白,我不應該混合邏輯和域對象,但是每個單獨的類都需要有自己的訪問數據的方法。Get(),GetAll(),Insert()顯然是不夠的。我在Questionnaire類下有GetAllForClient(...),GetAllForUser(...)等方法,然後User對象將有GetAllByClient(),GetCurrentUser()等。如果我要使用存儲庫模式? – Marko 2012-03-22 00:14:49

0

最接近的解決方案,你的方法是使用一個包裝類與檢索來自DB的問卷實例的構造。我討厭這樣的做法(DAO將是首選,完全像上面提到的存儲庫)。

public class QuestionnaireWrapper: Questionnaire { 

    private Questionnaire _q; 

    public QuestionnaireWrapper(int id) 
    { 
     _q = (from q in db.Questionnaires 
      where q.Id == id 
      select q).SingleOrDefault(); 
    } 

    public new string Name 
    { 
     get { return _q.Name; } 
     set { _q.Name = value; } 
    } 

    [Other overrides, all of them] 
} 

你試圖實現(this = ...)什麼是可能的,因爲違反了基本編程原則。當我需要爲遠程對象創建遠程包裝(: MarshalByRefObject)時,我只使用過這種方法一次。相信我,這不是一個乾淨的方法。當我清楚地說出這個問題時,請不要低估我的錯誤代碼;-)

觀察no。 2:通過閱讀你的代碼的第二部分,我發現你很近。這就是爲什麼靜態方法是! :)

public static Questionnaire Get(int id) 
{ 
    return (from q in db.Questionnaires 
      where q.Id == id 
      select q).SingleOrDefault(); 
} 

然後

Questionnaire qs = Questionnaire.Get(1); 
+0

雖然我和你一樣,因爲在這種情況下,Repository模式可能有點矯枉過正,他說他不能使用靜態方法「,因爲DataContext將無法跟蹤我對對象所做的任何更改」。我仍然認爲這將是更好的方法,但似乎無法完成。 – foliveira 2012-03-22 12:46:32

+0

我錯過了那部分:( – 2012-03-22 13:27:23