Круговое переключение объектов SubSonic DAL с помощью WCF

Вопрос: Как сохранить «грязность» объектов SubSonic, когда они отправляются туда и обратно через службу Windows Communication Foundation?

А именно:

У меня есть вызов службы 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?


person Guido Domenici    schedule 30.09.2009    source источник


Ответы (1)


Я нашел решение, но оно кажется хакерским, и было бы здорово, если бы его проверил кто-то, кто знает о SubSonic больше, чем я. Идея состоит в том, что в серверном коде, который сохраняет MyObjectCollection, я бы создал столько же новые экземпляры 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();
}
person Guido Domenici    schedule 30.09.2009