gpt4 book ai didi

c# - 使用 WCF 往返 SubSonic DAL 对象

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:10 27 4
gpt4 key购买 nike

问题:当 SubSonic 对象通过 Windows Communication Foundation 服务来回发送时,如何保留它们的“脏”?

即:

我有一个返回 SubSonic (2.2) 对象集合的 WCF 服务调用,如下所示:

// 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 线时将它们标记为脏?

最佳答案

我找到了一个解决方案,但感觉很老套,如果能由比我更了解 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();
}

关于c# - 使用 WCF 往返 SubSonic DAL 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1496577/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com