这是我正在做的事情,而不是为我工作。
我有一个使用SubSonic 3 ActiveRecord模板生成的DAL,我有一个服务层(如果你很好的业务层),它有外观和一些验证的混合。
假设我在服务层上有一个方法,如public void UpdateClient(Client client); 在我的GUI中,我创建一个Client对象,用一些带有ID的数据填充它,并将其传递给服务方法,这从未起作用,脏列集合(跟踪哪些列被更改以便使用更高效的更新语句)始终为空
如果我试图从GUI中的数据库中获取对象,那么将其传递给服务方法,它也无法正常工作。
我发现唯一可行的方案是,如果我从数据库中查询对象,并在GUI内的同一个上下文中调用Update(),这就会破坏我创建的整个服务层。
然而,对于插入和删除一切工作正常,我想知道这是否必须对对象跟踪做一些事情,但我所知道的是SubSonic不这样做。
请指教。 谢谢。 阿德尔。
答案 0 :(得分:2)
这似乎是一个功能,而不是一个错误。如果从DB加载对象,Subsonic将仅将列标记为脏。因此,您无法真正保存和对象,添加对其属性的更改,然后再次保存。去图。
bool _MyProp;
public bool MyProp
{
get { return _MyProp; }
set
{
if(_MyProp!=value){
_MyProp=value;
var col=tbl.Columns.SingleOrDefault(x=>x.Name=="MyProp");
if(col!=null){
if(!_dirtyColumns.Any(x=>x.Name==col.Name) && **_isLoaded**){
_dirtyColumns.Add(col);
}
}
OnChanged();
}
}
}
查看成员变量_isLoaded如何为false,除非该对象确实是从DB加载的。 Subsonic从不将我的属性添加到脏列列表中。
您的存储库Save()方法必须如下所示:
public MyObject Save(Myobject myObject)
{
myObject.Save();
myObject= MyObject.SingleOrDefault(x => x.Id == myObject.Id);
return myObject;
}
答案 1 :(得分:1)
而不是:
public MyObject Save(Myobject myObject)
{
myObject.Save();
myObject= MyObject.SingleOrDefault(x => x.Id == myObject.Id);
return myObject;
}
你可以这样做:
myObject.SetIsLoaded(true);
这样可以节省再次查询数据库服务器的费用。
例如:
myObject.Save();
myObject.Name ="Something else";
myObject.SetIsLoaded(true);
myObject.Save();