1

これが私がやっていることであり、私のために働いていません。

SubSonic 3 ActiveRecord テンプレートで生成された DAL があります。ファサードといくつかの検証が混在するサービス層 (ビジネス層) があります。

public void UpdateClient(Client client); のようなサービス層にメソッドがあるとします。私のGUIでは、クライアントオブジェクトを作成し、IDを含むデータを入力してサービスメソッドに渡しますが、これは機能しませんでした。ダーティカラムコレクション(より効率的な更新ステートメントを使用するために変更されたカラムを追跡します)は常に空です.

GUI 内のデータベースからオブジェクトを取得しようとしても、サービス メソッドに渡しても機能しません。

データベースからオブジェクトをクエリし、GUI 内の同じコンテキストで Update() を呼び出すと、作成したサービス レイヤー全体が無効になります。

ただし、挿入と削除のすべてが正常に機能しているため、オブジェクト追跡で何かを行う必要があるのではないかと思いますが、SubSonic はそれを行わないことがわかっています。

ご意見をお聞かせください。ありがとう。アデル。

4

2 に答える 2

2

バグではなく機能のようです。Subsonic は、オブジェクトが 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();
        }
    }
}

オブジェクトが実際に DB からロードされない限り、メンバー変数 _isLoaded がどのように false になるかを確認してください。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 に答える