2008-10-29 3 views
0

Castle ActiveRecord를 사용하고 있지만 NHibernate에서 작동하는 솔루션이 ActiveRecord에서 작동해야하므로이 질문이 NHibernate에도 적용됩니다. 어쨌든, 내가 가지고있는 것은이 같은 기본 테이블 구조는 다음과 같습니다NHibernate/ActiveRecord - 외래 키 열에 만 매핑하는 방법은 무엇입니까?

TableA의 -hasMany-> TableB의

내가 해당 객체 EntityA 및 EntityB 있습니다. EntityA에는 EntityB 개체의 IList가 있습니다. 이 부분은 잘 작동합니다. 이제, EntityB에 EntityA에 대한 일종의 참조를 되길 바랍니다.

[BelongsTo("tableAid")] 
public EntityA Parent { get; set; } 

하지만 제가 정말하고 싶은 것은 :

[BelongsTo("tableAid")] 
public int ParentId { get; set; } 

나는처럼, 전체 EntityA 유형으로 다시 그것을 실제 참조를 제공하기 위해 EntityB에에 BelongsTo 속성을 사용할 수 있습니다 알고 따라서 EntityB는 실제 객체에 대한 참조가 아닌 상위 객체의 ID 만 저장합니다. 이것은 간단한 예이지만이 접근 방식을 사용하고자하는 좋은 이유가 있습니다. 지금 작업하고있는 응용 프로그램에는 특정 EntityB와 유사한 객체를 표시하는 페이지가 있으며 해당 페이지가 해당 상위 페이지에 대한 링크 (하이퍼 링크처럼)를 포함하고 싶습니다. 위의 첫 번째 접근법을 사용하여이 작업을 수행 할 수 있지만 실제로 필요한 모든 객체가 ID 일 때 전체 EntityA 객체를로드해야합니다. 거대한 거래는 아니지만 낭비되는 것 같습니다. 나는 [속성]을 외래 키에 플래그를 시도

그래서 같은 속성 ... 그게 더 나에게 해킹 것 같아, 다시 내가 게으른 로딩을 사용할 수 있습니다 알고 있지만 :

[Property] 
public int ParentId { get; set; } 

이 방법의 문제점은 새 개체 트리에서 EntityA.SaveAndFlush()를 수행 할 때 EntityB.ParentId가 null로 유지된다는 것입니다. 올바른 값이 데이터베이스에 쓰여지고 EntityA.Refresh()를 수행하여 값을 다시 EntityB.ParentId로 강제 설정할 수 있지만 다시 해킹 비트처럼 보입니다.

답변

2

게으른 로딩은 정확히 당신이 원하는 것입니다. 그리고 그것은 해킹도 아니며, NHibernate의 일부분에서 잘 테스트되고 구워졌으며 중요한 NHibernate 앱을 성능 튜닝 할 때 중요한 도구입니다.

"부모"EntityA를 지연로드 됨으로 표시하는 경우 EntityB.Parent.Id를 참조하면 EntityB를로드 할 때 NHIbernate가 이미 EntityA의 ID를로드 한 상태로 EntityA를로드하지 않습니다. 따라서 성능 저하없이 링크를 설정하십시오.

0

그냥이 : ParentId 가정

[Property] public int ParentId { get; set; } 

는 ... 실제 열 이름입니다.

몇 가지 다른 의견.

먼저, many-to-one 속성을 느리게로드하는 것을 고려해야합니다. 열심히로드하는 경우 심각한 성능 저하를 초래할 수있는 열의 부하가 발생할 수 있음을 인식해야합니다. 이렇게하려면 지연로드 클래스의 모든 공용 멤버를 가상으로 표시해야합니다.

둘째, 자녀와 부모 사이의 대응 관계가없는 일대 다 연관이있을 때마다 데이터베이스에서 FK를 null로 설정할 수 있어야합니다. NH가 새 하위 항목을 만들면 부모 ID가 null 인 항목을 삽입 한 다음 두 번째 단계에서 항목을 업데이트하기 때문입니다.

+0

제안 해 주셔서 감사합니다. 나는 실제로이 접근법을 이미 시도했지만, 나는 그 질문에 그것을 나열하는 것을 잊어 버렸다. 대부분 효과가 있지만 완벽하지는 않습니다. :( –

관련 문제