0

私はテーブルを持っています:

Page (
   Id int,
   Name nvarchar(50),
   TemplateName varchar(50)
   ...
)

そしてそれはドメインモデルにマッピングされています:

public class Page {
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
   public virtual Template Template { get; set; }
}

ドメイン モデルでは、"Template" プロパティは "string" 型ではないことに注意してください。Template クラスは次のようになります。

public class Template {
   public string Name { get; set; }
   // other properties...
}

「テンプレート」はファイル システムからロードされます。私は TemplateManager クラスを持っています:

public class TemplateManager {
    public static Template LoadTemplate(string templateName) {
        // check if there's a folder named <templateName>
    }
}

IUserType を使用して、「テンプレート」プロパティをマップできます。

public class PageMap : ClassMapping<Page> {
    public PageMap() {
        ...
        Property(c => c.Template, m => {
             m.Column("TemplateName");
             m.Type<TemplateUserType>();
        }
    }
}

public class TemplateUserType : IUserType {
    public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner)
    {
        var templateName = rs[names[0]].AsString();

        if (!String.IsNullOrEmpty(templateName))
        {
            return TemplateManager.LoadTemplate(templateName);
        }

        return null;
    }
}

さて、これまでのところとても良いです。しかし、問題は、Linq クエリで Template プロパティをどのように使用できるかということです。例:

var pages = session.Query<Page>().Where(it => it.Template.Name == "MyTemplate");

解決策は、を実装するクラス(たとえば、TemplatePropertyHqlGenerator)を作成することだと思いますIHqlGeneratorForProperty。これは NHibernate 3 が提供する linq クエリ拡張ポイントです。しかし、この TemplatePropertyHqlGenerator クラスをどのように記述するのでしょうか?

ありがとうございます!

4

1 に答える 1

0

このIUserTypeインターフェースでは、アトミックと見なされるタイプを定義できます。つまり、タイプのインスタンス間で直接比較を実行でき、NHibernateはそれらを変換する方法を認識します。

たとえば、次のクエリが評価されます。

var template = new Template();
session.Query<Page>().Where(it => it.Template == template);

次に操作できるコンポーネント値を持つタイプを定義する場合は、ICompositeUserTypeインターフェースを実装する必要があります。このインターフェースでは、型のプロパティをアトミック要素として定義し、NHibernateに型の特定のプロパティを理解するために必要な情報を提供する必要があります。

結果として、実装するよりも少し複雑IUserTypeですが、達成したいことを容易にするはずです。

タイプのインターフェースを実装するわかりやすい例を次に示します。http Money//geekswithblogs.net/opiesblog/archive/2006/08/05/87218.aspx

于 2012-05-13T11:11:04.423 に答える