2009-05-13 16 views
2

ブランチIDとブランチ名も含むデータベーステーブル "Employees"を使用して、EmployeeとBranchエンティティを持つWebサイトで作業します。従業員と支店を同じテーブルからマップする必要があるため、クライアントのデータベースを変更することはできません。NHibernateと非正規化テーブル

私は、マッピングXMLに明確なリストや従業員テーブルからの枝のセットを得るためにいくつかのタイプのdistinct節が必要でしょうか?

両方のクラスを同じテーブルにマップする方法はありますか? (それはFluent NHibernateで行うことができますか?)

+0

従業員と支店のビジネス関係は何ですか?従業員に支店はありますか? –

+0

はい、従業員には支店が1つあります。 –

答えて

1

成分を使用してください。 FluentNhibernateはわかりませんが、xmlでは、次のようになります。

<class name="Employee"> 
    ... 

    <component name="MyBranch"> 
    <!-- Branche properties are here: --> 
    <property name="BrancheName"/> 
    <property name="..."/> 
    </component> 
</class> 

class Employee 
{ 
    Branch MyBranch { get; private set; } 
} 

class Branch 
{ 
    string BrancheName { get; private set; } 
} 

実際にはかなり簡単です。また、従業員に常にブランチがある場合にテーブルを結合する必要がないため、パフォーマンス上の理由からこれを実行します。

注:すべての列がNULLの場合、myBranchはnullになります。

2

ステファンは正しいです、コンポーネントを使用してください。コンパイラが自動的にタイプを把握するので、Component<Branch>がちょうどComponentに短縮することができ

class Branch 
{ 
    string Name { get; set; } 
    DateTime DateOpened { get; set; } 
} 

class Employee 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
    Branch Branch { get; set; } 
} 

class EmployeeMap : ClassMap<Employee> 
{ 
    public EmployeeMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Component<Branch>(x => x.Branch, c => { 
      c.Map(x => x.Name); 
      c.Map(x => x.DateOpened); 
     }); 
    } 
} 

:FluentNHibernateでは、それは次のようになります。接頭辞に追加する

public static class BranchMap 
{ 
    public Action<ComponentPart<Branch>> AsComponent() 
    { 
     return c => 
     { 
      c.Map(x => x.Name); 
      c.Map(x => x.DateOpened); 
     }; 
    } 
} 

また、これは、それが容易になります/:また、私がやりたいことは、私はコンポーネントをマッピングし、どこでも自分自身を繰り返す必要はありませんので、私のコンポーネントのクラスにAsComponent機能を提供していますエンティティーが、異なる命名体系を持つコンポーネントのインスタンスを複数持つ可能性がある場合のサフィックス関数。

+0

ありがとう、ありがとうございました。あなたが提案したようにFluent NHibernateで作業しました。 –

関連する問題