1

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

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

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

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

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

但是对于插入和删除一切正常,我想知道这是否必须与对象跟踪有关,但我知道 SubSonic 不会那样做。

请指教。谢谢。阿德尔。

4

2 回答 2

2

这似乎是一个功能,而不是一个错误。如果对象是从数据库加载的,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;
}
于 2010-05-28T09:41:07.977 回答
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(); 
于 2010-08-11T15:52:40.347 回答