2013-07-13 2 views
0

NHibernate 3.3.2.4 (Not Fluent)를 사용하고 있습니다 ... 데이터베이스 모델을 응용 프로그램 모델에 매핑하려고하고 있습니다.데이터베이스를 내 모델에 어떻게 매핑합니까?

I이 (간결 간체) 다음과 같은 데이터베이스 구조 :

LibraryItems 
------------ 
Id UniqueIdentifier Primary Key, 
UserId UniqueIdentifier Foreign Key References Users(UserId), 
Type SmallInt,    --Book, Magazine etc. 
ProductId UniqueIdentifier --Links to UserBooks When Type = 1 
          --   UserMagazines When Type = 2 

UserBooks 
--------- 
ProductId UniqueIdentifier Unique Foreign Key References Books(Id), 
--Other fields pertaining to books 

UserMagazines 
------------- 
ProductId UniqueIdentifier Unique Foreign Key References Magazines(Id), 
--Other fields pertaining to magazines 

UserBookmarks 
------------- 
Id UniqueIdentifier Primary Key, 
LibraryItemId UniqueIdentifier Foreign Key References LibraryItems(Id), 
BookmarkLocation NVarChar(100) 

나는 또한 다음과 같은 응용 프로그램 모델

public enum LibraryItemType 
{ 
    Book = 1, 
    Magazine = 2 
} 

public abstract class LibraryItem 
{ 
    public Guid Id { get; set; } //ProductId 
    public Guid UserId { get; set; } 
    abstract public LibraryItemType Type { get; } 
} 

public abstract class ReadableLibraryItem : LibraryItem 
{ 
    public Bookmark CurrentPosition { get; set; } 
} 

public class UserBook : ReadableLibraryItem 
{ 
    public override LibraryItemType Type { get { return LibraryItemType.Book; } } 
    //Other properties pertaining to books 
} 

public class UserMagazine : ReadableLibraryItem 
{ 
    public override LibraryItemType Type { get { return LibraryItemType.Magazine; } } 
    //Other properties pertaining to magazines 
} 

나는에서 매핑하는 방법으로 손해를보고 완전히 생각을 가지고 응용 프로그램 모델에 내 데이터베이스의 데이터 모델 ... 지금까지 내가 가지고 :

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping default-cascade="save-update" 
        assembly="Model" 
        namespace="Model.Library" 
        default-lazy="false" xmlns="urn:nhibernate-mapping-2.2"> 

    <class name="LibraryItem" table="LibraryItems" optimistic-lock="version"> 

    <id name="Id" type="Guid" unsaved-value="00000000-0000-0000-0000-000000000000"> 
     <generator class="assigned"/> 
    </id> 

    <discriminator column="Type" type="Int32" /> 
    <property name="UserId" type="Guid" not-null="true" /> 
    <property name="ProductId" type="Guid" not-null="true" /> 
    <property name="Type" type="Model.Library.LibraryItemType, Model" not-null="true" /> 

    <joined-subclass name="ReadableLibraryItem"> 

     <one-to-one name="CurrentPosition" type="Model.Library.Bookmark" class="Bookmark" property-ref="LibraryItemId" /> 

     <joined-subclass name="UserBook" table="UserBooks" lazy="false" discriminator-value="1"> 
     <key column="Id" /> 
     </joined-subclass> 

     <joined-subclass name="UserMagazineIssue" table="UserMagazineIssues" lazy="false" discriminator-value="2"> 
     <key column="Id" /> 
     </joined-subclass> 

    </joined-subclass> 

    </class> 
</hibernate-mapping> 

내 문제는 두 가지로 보입니다.

  1. 내 응용 프로그램 모델의 내 하위 유형 UserBooks 및 UserMagazines은 실제로 SubTypes of SubTypes이며 내 hbm 파일에서이를 모델링하는 방법을 알지 못합니다.
  2. discriminator는 LibraryItems 테이블에 있지만 하위 하위 클래스에 적용됩니다.

답변

0

은 내가 수동으로 매핑을 만든 이후 오랜만이야,하지만 과거에 나는 그런이 하나 매핑 발전기 사용하고 있습니다 : http://nmg.codeplex.com/

이 (그냥 EF 등) NHibernate에 중요한인가를 클래스에 테이블에서 매핑을 제공 . 하위 유형이있는 경우 별도의 클래스로 취급하고 매핑에 기본 "where"절을 추가합니다.

그래서 당신은 하위 유형의 각각에 대해 3 개 매핑 파일을했을 :

  • ReadableLibraryItem
  • UserBook

는 다시, 나는 이후 잠시왔다 UserMagazine 수동으로 매핑을했는데 그게 내가 어떻게 움직이는 지 알려주는 것입니다.

한 가지 더, "가상"이 필요한 모든 속성이 사용되었지만 여전히 그렇다면 확실하지 않습니다.

호프가 도움이 되었으면

관련 문제