3

NHibernateの使い方が初めてで、マッピングにXMLを使用せずにストアドプロシージャのClassMapを作成する方法についてオンラインで明確な例を見つけるのに苦労しました。私は最近Fluentインターフェースを使用してこれを動作させ、私が学んだものを共有したいと思っていました。Fluent NHibernateでのクラスマップ設定

問題のストアドプロシージャは、このようなオブジェクトを返します:だから

public class ProductCategoryNavigation 
{ 
    public virtual int CategoryId { get; protected set; } 
    public virtual int CategoryNodeId { get; set; } 
    public virtual int ParentCategoryNodeId { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Title { get; set; } 
    public virtual string SeoUrl { get; set; } 
    public virtual bool IsActive { get; set; } 
    public virtual int DisplayOrder { get; set; } 
    public virtual int ProductCount { get; set; } 
} 

を、どのように私はNHibernateのは、このオブジェクトにストアドプロシージャの結果をマッピングするために使用するのClassMapを作成するのですか?

答えて

0

NHibernateが適切にインストールされていると仮定すると、クラスマップを保存している場所で新しいクラスを作成します。

のようなクラスを作成します。

public class PcnMap : ClassMap<ProductCategoryNavigation> 
{ 
    Table("TableName"); 
    Id(x => x.CategoryId); 
    Map(model => model.CategoryNodeId); 
    // more like this for all your properties 
} 

あなたが設定し、必要に応じて、あなたがあなたのリポジトリを使用することを持っていたら。

基本的な設定だけです。データベース構造が複雑になればなるほど、クラスマップはより複雑になります。

+0

お返事ありがとうございます。私は働いているすべてのコードを投稿しますが、8時間が経過するまで私自身の質問に答えることはできません。 –

+0

チュートリアルのリンクは壊れています – sweetfa

+0

@sweetfaありがとう。私はリンクを削除し、別のものを探しています。 –

8

のClassMapは次のようになります。

public sealed class ProductCategoryNavigationMap : ClassMap<ProductCategoryNavigation> 
{ 
    public ProductCategoryNavigationMap() 
    { 
     ReadOnly(); 

     // Set "CategoryId" property as the ID column. Without this, 
     // OpenSession() threw an exception that the configuration was invalid 
     Id(x => x.CategoryId); 
     Map(x => x.CategoryNodeId); 
     Map(x => x.ParentCategoryNodeId); 
     Map(x => x.Name); 
     Map(x => x.Title); 
     Map(x => x.SeoUrl); 
     // The column name returned from the sproc is "VisibleInd", 
     // so this is here to map it to the "IsActive" property 
     Map(x => x.IsActive).Column("VisibleInd"); 
     Map(x => x.DisplayOrder); 
     Map(x => x.ProductCount); 
    } 
} 

ストアドプロシージャへの呼び出しは次のようになります。

public List<NavigationViewModel> GetNavigationViewModel(int portalId, int localeId) 
{ 
    const string sql = "EXEC [dbo].[Stored_Procedure_Name] @PortalId=:PortalId, @LocaleId=:LocaleId"; 
    return _session.CreateSQLQuery(sql) 
       .AddEntity(typeof(ProductCategoryNavigation)) 
       .SetInt32("PortalId", portalId) 
       .SetInt32("LocaleId", localeId) 
       .List<ProductCategoryNavigation>() 
       .Select(x => new NavigationViewModel 
           { 
            CategoryId = x.CategoryId, 
            CategoryNodeId = x.CategoryNodeId, 
            ParentCategoryNodeId = x.ParentCategoryNodeId, 
            Name = x.Name, 
            Title = x.Title, 
            SeoUrl = x.SeoUrl, 
            IsActive = x.IsActive, 
            DisplayOrder = x.DisplayOrder, 
            ProductCount = x.ProductCount 
           }) 
       .ToList(); 
} 

AddEntityは使いれる、エンティティ・クラスがに結果をマップするために何を言って呼び出し、上記で定義したProductCategoryNavigationMap:

.AddEntity(typeof(ProductCategoryNavigation)) 

あなたが注意している場合

  1. :PortalId
  2. : "SQL" 変数の値でyは、次の2つのパラメータが表示されます

    .SetInt32("PortalId", portalId) 
    .SetInt32("LocaleId", localeId) 
    

ものがへの呼び出しを行うことにより、設定されているとのLocaleID

.List<ProductCategoryNavigation>()を呼び出すとIListが提供され、LINQを使用して必要なものを投影することができます。この場合、NavigationViewModelのListを取得していますが、これは現在ProductCategoryNavigationと同じですが、必要に応じてエンティティから独立して変更できます。

これは、これが他の開発者がNHibernateの新機能に役立つことを望みます。

+0

AddEntityメソッドは純金です、ありがとう – rjlopes

関連する問題