我在VS中有一个解决方案“ MySolution”。在一个“域”项目中,我定义了以下几类:

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也无法解决问题。

最佳答案

在CastleRecord文档中找到了这篇文章。希望能帮助到你。

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

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

关于c# - FlushAction和Lazy属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16493690/

10-12 21:35