2009-04-08 16 views
2

我的數據庫看起來財產以後這樣的:nhibernate:如何映射引用enity的組件?

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); 
    } 
} 

有時候,我要做的就是添加靜態類的組件,使類映射更好一點:

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是一個簡單的函數,它將前綴附加到列名稱上(這在我可以使用的美妙的遺留數據庫中非常方便)。

然後在類映射你只是做:

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

OO,我喜歡更流暢成分的語法!我不確定我是否可以從組件中引用。感謝您驗證我可以。那麼引用你的國家實體呢?或者你最終改變了它? – 2009-04-08 16:38:46