0

NHibernate 3.3.2.4 (流暢ではない) を使用しています... データベース モデルをアプリケーション モデルにマップしようとしていますが、うまくいきません。

次のデータベース構造があります(簡潔にするために簡略化しています):

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>

私の問題は 2 つあります。

  1. アプリケーション モデルのサブタイプ UserBooks と UserMagazines は、実際には SubTypes の SubTypes であり、hbm ファイルでそれをモデル化する方法がわかりません。
  2. 識別子は LibraryItems テーブルにありますが、サブサブクラスに適用されます。
4

1 に答える 1

0

手動でマッピングを作成してからしばらく経ちましたが、過去に次のようなマッピング ジェネレーターを使用していました: http://nmg.codeplex.com/

NHibernate にとって重要 (EF と同様) は、テーブルからクラスへのマッピングを提供します。サブタイプがある場合は、それらを個別のクラスとして扱い、マッピングにデフォルトの「where」句を追加します。

したがって、サブタイプごとに 3 つのマッピング ファイルがあります。

  • ReadableLibraryItem
  • ユーザーブック
  • ユーザーマガジン

繰り返しになりますが、手動でマッピングを行ってからしばらく経ちましたが、それが私のやり方です。

もう 1 つ、以前はすべてのプロパティが「仮想」である必要がありましたが、今でもそうであるかどうかはわかりません。

お役に立てれば、

于 2013-07-13T02:52:23.583 に答える