使用WCF往返SubSonic DAL对象

时间:2009-09-30 07:28:08

标签: c# database wcf subsonic

问题:当在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线时将我的物体标记为脏?

1 个答案:

答案 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();
}