2009-09-30 48 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(); 
}