2010-08-25 103 views
1

假設我有一個表:NHibernate的:多列映射到一個單一的集合

ID(pk) | HOME_EMAIL | WORK_EMAIL | OTHER_EMAIL 
------------------------------------------------- 

和.NET類

class A { 
    int id; 
    List<MyEmail> emails; 
} 

class MyEmail { 
    string email; 
} 

我想沒有辦法對這些(多)列映射到NHibernate中的單個集合,還是有? :)

這意味着我們寧可不再修改數據庫模式,所以我們不能對數據庫做很多工作,如果有幫助的話。

回答

2

我會建議使用的接口工作,所以你可以做這樣的事情

interface IUser 
{ 
    int Id {get; set;} 
    IEnumerable<string> Emails {get;} 
} 

class MyUser : IUser 
{ 
    public int Id {get; set;} 
    public IEnumerable<string> Emails 
    { 
     get 
     { 
      return new [] { SomeEmail, SomeOtherEmail }; 
     } 
    } 

    public string SomeEmail { get; set; } 
    public string SomeOtherEmail { get; set; } 
} 

您的應用程序可以期待一個IUSER並不太在乎,我們得到了電子郵件列表。你會在NH中映射MyUser,而應用程序不會(也不應該)關心實際的實現。

+0

+1用於封裝。這個看起來更像我們以前的實施加上這個新的一起扔在一起。我會看到我能用這個做什麼。 – 2010-08-26 03:01:58

1

如果它沒有成爲一個集合,但可能是一個自定義的類型,而不是,說EmailAddresses包含三個屬性:

public class EmailAddresses 
{ 
    public virtual string Home { get; set; } 
    public virtual string Work { get; set; } 
    public virtual string Other { get; set; } 
} 

你可以使用一個組件到三列映射成三此對象父單個屬性的屬性:

public class MyUser 
{ 
    ... 
    public virtual EmailAddresses { get; set; } 
} 

您可以使用NHibernate的components如果你使用Fluent NHibernateComponentMap<T>類映射(automapper做不到組件)映射這些或。

+0

是的,這實際上是第一次實現,就在一些調整之前,這留給我們上面的例子。 :)我對這個結構有點偏心,但是如果有一種方法可以做到這一點,而不會浪費其他體系結構的改變,我認爲我們的開發人員會朝着這個方向發展。 :) – 2010-08-26 02:59:58

0

還有一個特點,這是非常接近你想要什麼,<dynamic-component>

http://nhibernate.info/doc/nh/en/index.html#components-dynamic的文檔應該讓你開始。

+0

yup,字典會爲數據庫模式(至少在一個骨架列表中)的邏輯映射做出更爲合理的映射,僅僅是因爲它們是鍵值的。我也會考慮這一點,謝謝! – 2010-08-26 02:56:53