2013-05-11 3 views
3

У меня есть решение «MySolution» в VS. В одном проекте «Домен» Я определил де следующих классов:Атрибут FlushAction и Lazy

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(); 
    } 
} 

В другом проекте «MySolution», названный «Bussines», я следующий код:

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

Итак, то, что проблема?. Этот код выходит из строя в # 1 из-за отсутствия доступа к ленивому атрибуту. Я не понимаю, почему, если этот объект находится в том же SessionScope от GetItem.

Additionaly, если в том же коде меняю FlushAction.Never к FlushAction.Auto, по ошибке пропадает.

Хотелось бы знать, почему это происходит ?. Почему следует FlushAction изменить свойства ленивая загрузка handeled?

Я не знаю, имеет ли значение метод overriden, или тот факт, что оба кода находятся в разных решениях. Наверное, нет, но ORM довольно удивительны.

Заранее спасибо.

PD: Если в следующей строке GetItem я:

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

Даже с FlushAction.Never, он также устраняет проблему.

+0

Это веб-проект или форма Windows? – SaXeTz

+0

Веб-проект .... –

ответ

0

Нашли эту статью в документах CastleRecord. Надеюсь, поможет.

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

Кроме того, он отмечает, что Управления сеансов ленивых свойств и отношений в настоящее время не поддерживается. Они все равно должны быть доступны из исходного SessionScope.

+0

В моем коде доступ к ленивому атрибуту осуществляется из исходного SessionScope, который извлекает его из БД. –