문제

여기에 nhibernate 멍청이. 다음과 같은 일반적인 시나리오를 매핑하는 방법에 대한 조언을 찾고 있습니다.

가게
ID PK
이름

Stockitem
ID PK
이름

StockitemStore
ID PK
Stockitemid fk
Storeid fk
팔레벨

나는 antadytostore (Store Store) 메소드를 사용하여 Stockitem Entity를 통해 다양한 스톡 시티를 다양한 스토리에 할당 할 수있는 도메인 모델을 만들었습니다.

이제 NHibernate를 사용하여 DB 스키마를 만듭니다. 이 기본 시나리오에 대한 매핑 파일을 어떻게 설정합니까?

모든 팁이 크게 높이 평가됩니다.

Chev

도움이 되었습니까?

해결책

불행히도이 관계는 nhibernate에서 모델링하기 가장 쉬운 일이 아니며 링크 테이블의 데이터에서 쿼리를 수행하려고 할 때 발생할 수있는 몇 가지 고유 한 문제가 있습니다. 잘 작동합니다.

이것에 대한 나의 접근 방식은 매장 매핑의 다음 관계와 Stockitem 매핑의 역 관계를 가진 두 개의 다중 매핑으로 설정하는 것입니다.

<bag name="StockItems" table="StockItemStore" lazy="true">
  <key column="StoreId" />
  <composite-element class="SuperStore.Components.StockItemStore, SuperStore.Components">
    <property name="ParLevel" type="Int32" />
    <many-to-one name="StockItem" column="StockItemId" class="SuperStore.Components.StockItem, SuperStore.Components" fetch="join" cascade="all" />
  </composite-element>
</bag>

상점 수업에는 다음 컬렉션이 있습니다.

public virtual IList< StockItemStore > StockItems {get;set;}

그리고 Stockitem은 다시 역전을 가질 것입니다.

public virtual IList< StockItemStore > Stores {get;set;}

StockItemStore 객체에는 객체 (저장소 또는 Stockitem)와 링크 테이블에있는 추가 정보가 포함될 수 있습니다. (이 경우 Parlevel 만.

어떤면에 따라, 당신은 StockitemStore 객체를 보거나 stockitem에서보고있는 것입니다. 두 개의 클래스로 나눌 수 있지만이 접근법은 작업하기가 더 쉽다는 것을 알게됩니다. 개발자로서 당신이 어느쪽에 접근하고 있는지 알아야하지만, 내 의견으로는 코드를 더 간단하고 재사용 할 수있는 좋은 트레이드 오프입니다.

public class StockItemStore
{
    private StockItem stockItem;
    private Store store;

    public virtual StockItem StockItem
    {
        get
        {
            if (stockItem == null)
            {
                stockItem = new StockItem();
            }

            return stockItem;
        }
        set
        {
            stockItem = value;
        }
    }

    public virtual Store store
    {
        get
        {
            if (store == null)
            {
                store = new Store();
            }

            return store;
        }
        set
        {
            store = value;
        }
    }

    public virtual int ParLevel { get; set; }

}

내 접근 방식은 귀하의 질문에 정의 된대로 StockitemStore의 단일 고유 식별자를 사용하지 않고 링크 테이블의 복합 키에 해당하는 것입니다. 그러나 그것은 과거에 전반적으로 저를 잘 섬겼습니다. 나는 당신이 정말로 당신이 정말로 그것을 필요로한다면 어떻게 든 그 신분증을 신발 할 수 있다고 확신합니다.

이 접근법은 HQL을 사용하는 쿼리에 적합합니다. iCRiteria Queries를 사용하려고하면 약간의 원조가됩니다. 데이터베이스보기를 사용하여 나에게 효과가있는 쿼리에 사용할 다른 테이블을 시뮬레이션하는 데 몇 가지 솔루션이 있습니다.

ICRiteria Queries를 수행 해야하는 경우 알려 주시면 샘플 코드를 게시 할 수 있습니다.

  • 맥스

다른 팁

나는 nhibernate에 대한 읽기를 강력히 권장합니다. 다음은 아주 좋은 출발점입니다.

nhibernate faq

또한 처음 몇 번 손으로 매핑을하는 것이 좋습니다. 그런 다음 유창한 nhibernate를 확인해야합니다. 유창한 nhibernate는 (무엇보다도) 도메인 모델에서 매핑을 자동으로 생성하고 데이터베이스 스키마를 생성하는 데 도움이 될 수 있습니다. 점점 좋아지고있는 매우 유연한 도구입니다. 여기에서 찾을 수 있습니다.

유창한 nhibernate

행운을 빕니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top