2009-09-02 35 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