3

VS にソリューション 'MySolution' があります。1 つのプロジェクト「ドメイン」で、次のクラスを定義しました。

public class CarBase
{
    public virtual void Foo();
}

public class Car : CarBase
{
    [BelongsTo(..., Lazy=FetchWhen.OnInvoke)]
    public virtual Person person { get; set; };

    public override void Foo()
    {
        person.HasCar = true; // #1
        person.Save();
    }
}

「Bussines」という名前の「MySolution」の別のプロジェクトには、次のコードがあります。

using(SessionScope session = new SessionScope(FlushAction.Never))
{
    CarBase carBase = CarBase.GetItem(123);
    carBase.Foo();
}

わかりました、それで問題は何ですか? そのコードは、「遅延属性へのアクセスに失敗しました」という理由で #1 で失敗します。そのオブジェクトがGetItemの同じSessionScopeにある場合、その理由がわかりません。

さらに、同じコードでFlushAction.NeverFlushAction.Autoに変更すると、エラーが消えます。

なぜこれが起こるのか知りたいですか?FlushActionプロパティが遅延読み込みの処理方法を変更する必要があるのはなぜですか?

オーバーライドされたメソッドなのか、それとも両方のコードが異なるソリューションにあるという事実が重要なのかはわかりません。そうではないと思いますが、ORM は非常に驚くべきものです。

前もって感謝します。

PD: GetItemの次の行で私が行う場合:

if(carBase is Car)
     ((Car)carBase).HasCar.ToString();

FlushAction.Neverを使用しても、問題は修正されます。

4

1 に答える 1