NHibernate: сопоставить несколько столбцов в одну коллекцию - PullRequest
1 голос
/ 26 августа 2010

Предположим, у меня есть таблица:

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

и классы .NET

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

class MyEmail {
    string email;
}

Полагаю, в NHibernate нет способа отобразить эти (несколько) столбцов в одну коллекцию, или есть? :)

Дошло до того, что мы больше не хотели бы возиться со схемой базы данных, поэтому мы не можем многое сделать с базой данных, если это поможет.

Ответы [ 3 ]

2 голосов
/ 26 августа 2010

Я бы предложил работать с интерфейсами, чтобы вы могли сделать что-то вроде этого

 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, и ему все равно, где мы получили список электронных писем. Вы бы отобразили MyUser в NH, тогда как приложение не заботится (и не должно заботиться) о фактической реализации.

1 голос
/ 26 августа 2010

Если это не обязательно должен быть набор, но может быть пользовательский тип, скажем, 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, используя компоненты или, если вы используете Fluent NHibernate с картой классов ComponentMap<T> (automapper не может выполнять компоненты).

0 голосов
/ 26 августа 2010

Есть функция, которая очень близка к тому, что вы хотите, <dynamic-component>

Документация по http://nhibernate.info/doc/nh/en/index.html#components-dynamic должна помочь вам начать работу.

...