问题:当在Windows Communication Foundation服务中来回发送SubSonic对象时,如何保留它们的“肮脏”?
即便:
我有一个WCF服务调用,它返回一组SubSonic(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);
然而,发生的事情是SubSonic“objs.SaveAll()”调用没有保存任何东西,因为它没有“意识到”objs [3]已被修改,即没有人翻转“脏”位在那一栏上。
这是我正在实施的反模式,还是这是一种明智的做事方式?如果是这样,我怎么能说服SubSonic在穿过WCF线时将我的物体标记为脏?
答案 0 :(得分:0)
我找到了一个解决方案,但感觉很讨厌,而且对于那些了解SubSonic比我更了解的人来说,这将是很好的。这个想法是在服务器端代码中保存MyObjectCollection我会创建尽可能多的 new MyObject实例,设置正确的主键,假定SubSonic相信它们刚刚从DB加载,从旧的填充新对象,然后保存新的集合。所以上面的方法看起来像这样:
// 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();
}