2009-09-02 59 views
0

我有我的數據庫中的表看大致是這樣的:如何從NHibernate的「組名」列中映射組實體類?

create table Foo (
    Id    int identity  not null, 
    Name   varchar(100)  not null, 
    GroupName  varchar(100)  not null, 
    constraint PK_Foo primary key (Id) 
) 

現在我想這個表映射到兩個實體類是這樣的:

class Foo { 
    public virtual in Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual Group Group { get; set; } 
} 

class FooGroup { 
    public virtual string Name { get; set; } 
    public virtual ISet<Foo> Foos { get; private set; } 
} 

這是可能的NHibernate的?我試圖搜索網絡和NH文檔,但我真的不知道要尋找什麼 - 對搜索查詢的想法將不勝感激。

也許我可以做一個映射FooGroup使用自定義的HQL/SQL查詢來選擇不同的組名和另一個自定義查詢來選擇適當的一組包含的項目?

+0

你能告訴我們更多關於你想達到的目標嗎,爲什麼你需要兩個班級? – epitka 2009-09-02 15:10:07

+0

最初設計數據模型時,組名稱不過是名稱。後來,隨着事態的發展,看起來實際的團體現在有遵守的商業規則。例如:FooGroup應該有一個方法Bar(),它將一些神奇的業務集合函數應用於包含的Foos並返回一個整數。試圖這樣做的DDD方式,我想我可以重構字符串'GroupName到FooGroup類,並在這裏聲明的方法。這有意義嗎? – 2009-09-03 16:37:23

+0

聽起來和我的問題類似 Firo 2011-08-30 14:27:23

回答

0

我不認爲這是可以做到你在NHibernate的映射......要什麼純粹雖然我可以被證明是錯誤由別人:-)

OTOH它很容易從定義一個簡單的映射你的表成:

class RawFooData 
{ 
    public virtual in Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual string GroupName { get; set; } 
} 

,然後再處理這個讓出你想要的值:

IEnumerable<FooGroup> groups = allRawFooData.Select(data => data.GroupName) 
             .Distinct() 
             .Select(name => new FooGroup() 
                 { 
                  Name = name 
                 }); 

foreach(var group in groups) 
{ 
    group.Foos = allRawFooData.Where(data => data.GroupName == group.Name); 
} 

我想你只能找到性能問題,在這裏,如果你是德以非常大量的數據(例如10K行或更多)。

+0

這正是我現在所擁有的。請看看我對於爲什麼想介紹分組課程的評論的回覆。 – 2009-09-04 21:26:05