2009-09-30 50 views
3

問:如何保留SubSonic對象在Windows Communication Foundation服務中來回傳送時的「骯髒」?帶WCF的往返SubSonic DAL對象

機智:

我有一個WCF服務調用返回亞音速的集合(2.2)的對象,像這樣:

// WCF server side 
public MyObjectCollection GetAllMyObjects() 
{ 
    // Retrieve a MyObjectCollection (SubSonic-generated class) from the DB 
    return DB.Select().From<MyObject>.ExecuteAsCollection<MyObjectCollection>(); 
} 

,另一種是讓客戶節省他們:

// WCF server side 
public void SaveAllMyObjects(MyObjectCollection objs) 
{ 
    objs.SaveAll(); 
} 

在WCF客戶端,我檢索這個集合(通過生成的WCF代理),我修改了它的一些成員,然後我保存它:

// WCF client side 
MyObject[] allObjects = myWcfClient.GetAllMyObjects(); 
allObjects[3].SomeProperty = "Some other value"; 
myWcfClient.SaveAllMyObjects(allObjects); 

會發生什麼,但是,是亞音速「objs.SaveAll()」調用不會保存任何內容,因爲它沒有「意識到」是OBJ文件[3]已被修改,即沒有人翻轉「髒「的位。

這是我正在實施的反模式,還是這是一種明智的做事方式?如果是這樣,我如何說服SubSonic在穿過WCF電線時將我的物體標記爲髒?

回答

0

我發現了一個解決方案,但它感覺很不好,它會被一個對SubSonic比我更瞭解的人審查。這個想法是,在保存MyObjectCollection的服務器端代碼中, d創建儘可能多的新的傳入的MyObject實例,設置正確的主鍵,假SubSonic認爲它們剛剛從數據庫加載,從舊數據填充新對象,然後保存新集合。所以上面的方法看起來像這樣:

// WCF server side 
public void SaveAllMyObjects(MyObjectCollection objs) 
{ 
    MyObjectCollection fakeColl = new MyObjectCollection(); 
    foreach (var oneObj in objs) 
    { 
     var oneFakeObj = new MyObject(); 
     oneFakeObj.Id = oneObj.Id; // Primary key 
     // Pretend oneFakeObj was just loaded from the DB 
     oneFakeObj.IsNew = False; 
     oneFakeObj.IsLoaded = True; 
     // Copy all column values 
     foreach (var col in MyObject.Schema.Columns) 
     { 
      oneFakeObj.SetColumnValue(col.ColumnName, oneObj.GetColumnValue(col.ColumnName)); 
     } 
     fakeColl.Add(oneFakeObj); 
    } 
    fakeColl.SaveAll(); 
}