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

NHibernate:将多个列映射到单个集合中,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,假设我有一张桌子: ID(pk) | HOME_EMAIL | WORK_EMAIL | OTHER_EMAIL ------------------------------------------------- 还有.NET类 class A { int id; List<MyEmail> emails; } class MyEmail { string email; } A类{ int-id; 列出电子邮件; } 类邮件{ 字符串电子邮件; }

假设我有一张桌子:

 ID(pk) | HOME_EMAIL | WORK_EMAIL | OTHER_EMAIL
-------------------------------------------------
还有.NET类

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

class MyEmail {
    string email;
}
A类{
int-id;
列出电子邮件;
}
类邮件{
字符串电子邮件;
}
我想在NHibernate中没有办法将这些(多个)列映射到单个集合,或者有吗?:)


到了一定程度,我们不想再修补数据库模式,这样我们就不能对数据库做太多事情了,如果这有帮助的话。

我建议使用接口,这样您就可以做类似的事情了

 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
{
int Id{get;set;}
IEnumerable电子邮件{get;}
}
类MyUser:IUser
{
公共int Id{get;set;}
公开电子邮件
{
得到
{
返回新[]{SomeEmail,SomeOtherEmail};
}
}
公共字符串SomeEmail{get;set;}
公共字符串SomeOtherEmail{get;set;}
}

您的应用程序可能需要一个IUser,而不关心我们从何处获得电子邮件列表。您可以在NH中映射MyUser,而应用程序不(也不应该)关心实际的实现。

如果它不必是集合,但可以是自定义类型,则可以说是包含三个属性的
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映射这些组件,或者如果您正在使用
ComponentMap
classmap(automapper不能做组件)。

有一个功能非常接近您想要的,


上的文档应该可以让您开始使用。

是的,字典可以为数据库模式提供更具逻辑性的映射(至少在一个框架列表上),因为它们是键式的。我也会研究一下,谢谢!是的,这实际上是第一个实现,就在一些调整之前,这给我们留下了上面的例子。:)我有点偏爱这种结构,但如果有一种方法可以做到这一点,而不必进行另一次架构更改,我认为我们的开发人员将朝着这一方向迈进。:)+1对于封装,请抬起头。这一个看起来更像我们以前的实现,加上这个新实现。我会看看我能用它做些什么。