Subsonic N层亚音速3,脏列集合在更新时始终为空

Subsonic N层亚音速3,脏列集合在更新时始终为空,subsonic,subsonic3,data-access-layer,Subsonic,Subsonic3,Data Access Layer,这就是我正在做的,而不是为我工作 我有一个使用亚音速3 ActiveRecord模板生成的DAL,我有一个服务层(业务层,如果你愿意的话),它混合了外观和一些验证 假设我在服务层上有一个方法,比如publicvoidupdateclient(客户机); 在我的GUI中,我创建了一个客户机对象,用一些ID数据填充它并将其传递给服务方法,但这从未起作用,脏列集合(跟踪哪些列被更改以使用更高效的update语句)始终为空 如果我试图从GUI中的数据库获取对象,然后将其传递给服务方法,它也不会工作 我发

这就是我正在做的,而不是为我工作

我有一个使用亚音速3 ActiveRecord模板生成的DAL,我有一个服务层(业务层,如果你愿意的话),它混合了外观和一些验证

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

如果我试图从GUI中的数据库获取对象,然后将其传递给服务方法,它也不会工作

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

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

请给我一些建议。 谢谢
Adel.

这似乎是一个功能,而不是一个bug。如果对象是从DB加载的,亚音速将仅将列标记为脏列。因此,您无法真正保存和删除对象,请添加对其属性的更改,然后再次保存。算了吧

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加载的。亚音速从不将我的属性添加到脏列列表中

您的repository Save()方法必须如下所示:

public MyObject Save(Myobject myObject)
{
    myObject.Save();
    myObject= MyObject.SingleOrDefault(x => x.Id == myObject.Id);
    return myObject;
}
而不是:

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(); 
您的GUI层是什么(winforms/xaml/webforms/mvc)?