2009-04-08 6 views
2

私のDBは、このように気にいらになります:nhibernate:エンティティを参照するコンポーネントをどのようにマッピングするのですか?

MyEntity  State 
-----  ----- 
id   id 
street  name 
stateId  ... 
zip 
status 
... 

私のモデルは次のようになります。私は私のアドレスコンポーネントがエンティティを参照すると少し不快だ

class MyEntity 
{ 
    int id { get; set; } 
    Address location { get; set; } 
    string status { get; set; } 
    // ... 
} 

class Address 
{ 
    string street { get; set; } 
    string zip { get; set; } 
    State state { get; set; } 
    // ... 
} 

class State 
{ 
    int id { get; set; } 
    string name { get; set; } 
    // ... 
} 

。貧しいモデルのようなにおいがします。それは...ですか?そうでない場合は、どのようにマップすればよいでしょうか(できれば流暢なnhibernateで)。

答えて

1

また、コンポーネントからエンティティを参照する方法についてもわかりません。私は自分でやったことがあります。

限りマッピングなど、それは非常に簡単です:

public class MyEntityMap : ClassMap<MyEntity> 
{ 
    public MyEntityMap() 
    { 
     Id(x => x.id); 
     Component<Address>(x => x.location, c => 
     { 
      c.Map(x => x.street); 
      c.Map(x => x.zip); 
      c.References<State>(x => x.state); 
     }); 
     Map(x => x.status); 
    } 
} 

時々私は何をすべきかのClassMapは少し立派にするためにコンポーネントの静的クラスを追加するものです。この中

public static class NameMap 
{ 
    public static Action<ComponentPart<Name>> AsComponent(string prefix) 
    { 
     return c => 
     { 
      c.Map(x => x.Title, ColumnName(prefix, "Title")); 
      // and so on 
     }; 
    } 
} 

case ColumnNameは、プレフィックスをカラム名に付加する単純な関数です(これは、私がプレイする素晴らしいレガシーDBには非常に便利です)。

は、その後のClassMapであなただけの操作を行います。

Component<Name>(x => x.Name, c => NameMap.AsComponent("prefix")); 
+0

OOが、私はより多くの流暢なコンポーネントの構文が好き!私がコンポーネントから参照できるかどうかはわかりませんでした。私ができることを確認してくれてありがとう。あなたの状態エンティティを参照することはそれから働きましたか?それとも、それを変えたのですか? –

+0

はい、そのまま動作します。私がそれを見る方法では、適切なモデルはAddressが別のエンティティになることです。この場合、AddressとStateの間の関係を持つ場合は問題ありません。しかし、レガシーDBの場合、私は再構成の選択肢がないので、何ができるかに焦点を当てる必要があり、何が「正しい」ものではないかに焦点を当てなければなりません。 –

関連する問題