2011-05-05 2 views
1

NHibernate에 초보자이고 NHibernate 2.1.2.4000 FluentNHibernate 버전 1.1.0.685를 사용하여 이상한 동작이 발생했습니다. 어떻게 든 GUID 인 ID는 Item 객체에 처음 액세스 한 후 빈 상태로 재설정됩니다. 2 행에서와 같이 관련 객체에 액세스 할 때 발생하는 부작용이 있습니까?NHibernate, 관련 객체에 접근 한 후 속성을 재설정 함

1. System.Diagnostics.Debug.WriteLine(widgetQueue.Item.Id); 
2. var ItemStageId = widgetQueue.Item.CurrentStage.Id.ToString(); 
3. System.Diagnostics.Debug.WriteLine(widgetQueue.Item.Id); 

Output Window: 
113a6af2-3fe2-49c2-9276-9ec30081a811  
00000000-0000-0000-0000-000000000000 

업데이트 : 새로운 가상에서 ID 필드를 변경

:

public class Item : EntityWithTypedId<Guid> 
{ 
    private Guid id; 

    [DomainSignature] 
    public new virtual Guid Id 
    { 
     get { return id; } 
     protected set { id = value; } 
    } 
    .... 
    public Item() { 
     Id = Guid.Empty; 
     .... 
    } 

    public Item(Guid id) 
     : base() 
    { 
     Id = id; 
    } 
} 

재정 에 :

public class Item : EntityWithTypedId<Guid> 
{ 
    private Guid id; 

    [DomainSignature] 
    public override Guid Id 
    { 
     get { return id; } 
     protected set { id = value; } 
    } 
    .... 
} 

나는 런타임 오류 이후를 기다리고 있었다 나는 읽었다. 게으른로드가 작동하려면 속성이 가상이어야합니다. 무슨 일이 일어나는가?

업데이트 2 : Id 속성을 지원하기 위해 인스턴스 변수를 선언 한 것으로 나타났습니다. 그래서 그것을 제거하고 기본 클래스 'ID를 액세스했습니다. 이것은 효과적이고 더 이해가되지만 이전 시도가 실패한 이유를 아직 발견하지 못했습니다.

공개 클래스 항목 : EntityWithTypedId { // 개인 Guid ID;

[DomainSignature] 
    public new virtual Guid Id 
    { 
     get { return base.Id; } 
     protected set { base.Id = value; } 
    } 
+0

당신이 당신의 위젯 큐 및 항목 클래스에 대한 코드를 게시 할 수 있습니까? 모든 관련 매핑이 도움이 될 것입니다. – AlexCuse

+0

나는 조금 더 주위에 땜질했고, 내가 약간의 진보를 만들었다라고 생각한다. 내가 어떻게 당신에게 매핑을 보여줄지 모르겠다. Sharp Architecure 프레임 워크를 사용하고 있으며 모델 생성 방법을 배웠습니다. –

+1

Sharp Arch.의 최신 버전에 익숙하지 않지만 ID 속성을 재정의 (또는 * new * 사용)하고 생성자를 사용하여 ID를 수락하는 등 코드에 이상한 점이 두 가지 있습니다. 이것은 문제를 일으킬 수있는 것처럼 보입니다. – cbp

답변

1

EntityWithTypedId는 이미 Id 속성을 정의하고 있으므로 직접 선언하지 않아도됩니다.

안전하게와 ID 속성을 사용할 수 있습니다 유창 매핑의 예를 들면 다음과 같습니다

Id(x => x.Id).GeneratedBy.GuidComb().UnsavedValue(Guid.Empty); 
+0

알아두면 좋겠지 만 [DomainSignature] 속성을 얻을 수 있습니까? –

+0

아니요,하지만 이해 합니다만,'[DomainSignature]'는 대용 키가 아닌 자연스러운 키를위한 것입니다. Id-Property는 nhibernate에 의해 처리되는 위의 코드와 지속성을위한 것입니다. – Firo

관련 문제