NHibernate:将多个列映射到单个集合中

时间:2010-08-25 23:39:30

标签: nhibernate nhibernate-mapping

假设我有一张桌子:

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

和.NET类

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

class MyEmail {
    string email;
}

我认为没有办法将这些(多个)列映射到NHibernate中的单个集合中,或者存在? :)

我们不再需要修改数据库模式,因此我们无法对数据库做太多工作,如果有帮助的话。

3 个答案:

答案 0 :(得分:2)

我建议使用Interfaces,这样你就可以做这样的事情

 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,而应用程序不会(也不应该)关心实际的实现。

答案 1 :(得分: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; }
}

您可以使用components在NHibernate中映射这些内容,或者如果您将Fluent NHibernateComponentMap<T>类图一起使用(automapper无法执行组件)。

答案 2 :(得分:0)

有一项功能与您想要的功能非常接近,<dynamic-component>

http://nhibernate.info/doc/nh/en/index.html#components-dynamic上的文档可以帮助您入门。