C# 带WCF的往返亚音速DAL对象 问题:我如何保存亚音速对象的“肮脏”,当它们在Windows通信基础服务上来回发送时?

C# 带WCF的往返亚音速DAL对象 问题:我如何保存亚音速对象的“肮脏”,当它们在Windows通信基础服务上来回发送时?,c#,database,wcf,subsonic,C#,Database,Wcf,Subsonic,也就是说: 我有一个WCF服务调用,它返回亚音速(2.2)对象的集合,如下所示: // WCF server side public MyObjectCollection GetAllMyObjects() { // Retrieve a MyObjectCollection (SubSonic-generated class) from the DB return DB.Select().From<MyObject>.ExecuteAsCollection<MyO

也就是说:

我有一个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客户端,我检索这个集合(通过生成的WCF代理),修改它的一些成员,然后保存它:

// WCF client side
MyObject[] allObjects = myWcfClient.GetAllMyObjects();
allObjects[3].SomeProperty = "Some other value";
myWcfClient.SaveAllMyObjects(allObjects);
然而,发生的情况是,亚音速的“objs.SaveAll()”调用没有保存任何内容,因为它没有“意识到”objs[3]已被修改,即没有人翻转该列上的“脏”位


这是我正在实施的一种反模式,还是一种明智的做法?如果是这样的话,我如何说服亚音速公司在我的物体穿过WCF导线时将其标记为脏的呢?

我找到了一个解决方案,但它让人感觉不舒服,如果有比我更了解亚音速的人对它进行审查那就太好了。这个想法是,在保存MyObjectCollection的服务器端代码中,我将创建传入的尽可能多的新MyObject实例,设置正确的主键,假装亚音速,让人相信它们只是从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();
}
// 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();
}