2009-07-16 42 views
1

這是我正在做什麼,而不是爲我工作。N亞層SubSonic 3,骯髒的列收集一直是空的更新

我有一個用SubSonic 3 ActiveRecord模板生成的DAL,我有一個服務層(業務層,如果你的話)有正面和一些驗證的混合。

說我有一個服務層像public void UpdateClient(客戶端客戶端)的方法; 在我的GUI我創建一個客戶端對象用ID填充一些數據,並將其傳遞給服務方法,這從來沒有工作,髒列集合(跟蹤哪些列被改變,以便使用更有效的更新統計)是一直空。

如果我試圖從我的GUI中的數據庫中獲取對象,然後將它傳遞給服務方法它也不工作。

我發現工作的唯一場景是如果我從數據庫查詢對象,並在我的GUI中調用同一上下文中的Update(),這會破壞我創建的整個服務層。

但是,爲插入和刪除一切工作正常,我不知道這是否必須做跟蹤對象,但我知道是SubSonic不這樣做。

請指教。 謝謝。 Adel。

+0

什麼是你的GUI層(的WinForms/XAML/web表單/ MVC)? – 2009-07-16 17:50:15

回答

2

這似乎是一個功能,而不是一個錯誤。如果對象從數據庫加載,亞音速將只會將列標記爲髒。所以你不能真正的保存和對象,添加對其屬性的更改,然後再保存它。去搞清楚。

bool _MyProp; 
public bool MyProp 
{ 
    get { return _MyProp; } 
    set 
    { 
     if(_MyProp!=value){ 
      _MyProp=value; 
      var col=tbl.Columns.SingleOrDefault(x=>x.Name=="MyProp"); 
      if(col!=null){ 
       if(!_dirtyColumns.Any(x=>x.Name==col.Name) && **_isLoaded**){ 
        _dirtyColumns.Add(col); 
       } 
      } 
      OnChanged(); 
     } 
    } 
} 

看看成員變量_isLoaded是否爲false,除非該對象確實是從DB加載的。 Subsonic從不會將我的屬性添加到髒列的列表中。

你的倉庫保存()方法必須是這個樣子:

public MyObject Save(Myobject myObject) 
{ 
    myObject.Save(); 
    myObject= MyObject.SingleOrDefault(x => x.Id == myObject.Id); 
    return myObject; 
} 
1

相反的:

public MyObject Save(Myobject myObject) 
{ 
    myObject.Save(); 
    myObject= MyObject.SingleOrDefault(x => x.Id == myObject.Id); 
    return myObject; 
} 

你可以這樣做:

myObject.SetIsLoaded(true); 

這樣可以節省不必再次查詢數據庫服務器。

例如:

myObject.Save(); 
myObject.Name ="Something else"; 
myObject.SetIsLoaded(true); 
myObject.Save();