FlushAction和Lazy属性

时间:2013-05-11 04:15:48

标签: c# nhibernate orm lazy-loading castle-activerecord

我在VS中有一个解决方案'MySolution'。在一个项目'Domain'中,我定义了以下类:

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.Never 更改为 FlushAction.Auto ,则错误消失。

我想知道为什么会这样?为什么 FlushAction 属性会改变延迟加载的方式?

我不知道覆盖方法或两个代码在不同解决方案中的事实是否重要。我猜不是,但ORM非常令人惊讶。

提前致谢。

PD:如果在 GetItem 的下一行,我会:

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

即使使用 FlushAction.Never ,它也可以解决问题。

1 个答案:

答案 0 :(得分:0)

在CastleRecord文档中找到此文章。希望它有所帮助。

http://docs.castleproject.org/Active%20Record.The-ByteCode.ashx?HL=fetchwhen,oninvoke

此外,它还提到目前不支持延迟属性和关系的会话管理。这些仍然必须在原始的SessionScope中访问。