使用SubSonic 3,Dirty Columns集合的N层在更新时始终为空

时间:2009-07-16 14:41:20

标签: subsonic subsonic3 data-access-layer

这是我正在做的事情,而不是为我工作。

我有一个使用SubSonic 3 ActiveRecord模板生成的DAL,我有一个服务层(如果你很好的业务层),它有外观和一些验证的混合。

假设我在服务层上有一个方法,如public void UpdateClient(Client client); 在我的GUI中,我创建一个Client对象,用一些带有ID的数据填充它,并将其传递给服务方法,这从未起作用,脏列集合(跟踪哪些列被更改以便使用更高效的更新语句)始终为空

如果我试图从GUI中的数据库中获取对象,那么将其传递给服务方法,它也无法正常工作。

我发现唯一可行的方案是,如果我从数据库中查询对象,并在GUI内的同一个上下文中调用Update(),这就会破坏我创建的整个服务层。

然而,对于插入和删除一切工作正常,我想知道这是否必须对对象跟踪做一些事情,但我所知道的是SubSonic不这样做。

请指教。 谢谢。 阿德尔。

2 个答案:

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