2010-08-25 110 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