NHibernate: сопоставить один и тот же класс с несколькими таблицами в зависимости от родителя - PullRequest
2 голосов
/ 30 марта 2009

У меня есть модель, в которой несколько классов имеют список типов значений:

class Foo { public List<ValType> Vals; }
class Bar { public List<ValType> Vals; }

Foo и Bar не связаны, кроме того, что они оба содержат эти значения. Правила добавления, удаления и т. Д. ValTypes различны для каждого класса. Я хотел бы сохранить этот дизайн в моем коде.

Бывают случаи, когда я хочу скопировать, например, несколько Vals из Foo в Bar. В базе данных каждый ValType имеет свою собственную таблицу, чтобы она была маленькой, легкой (она просто имеет родительский ID + 2 поля) и позволяла проверять целостность. Я знаю, что NHibernate говорит, что я должен сохранять свои объекты такими же гранулярными, как база данных, но это только делает мой код более уродливым.

Лучшее, что я до сих пор думал, - это создание отдельных подклассов ValType, по одному для каждого родителя. Тогда я могу отобразить их на этом уровне. Затем я подключу логику добавления и удаления для автоматического преобразования между правильными подклассами и фактически сохраню их в закрытом списке с правильным типом подкласса. Но это казалось немного запутанным.

Как мне отобразить это в NHibernate (Fluent NHibernate, если это возможно)?

Пожалуйста, дайте мне знать, если это дубликат - я не совсем уверен, как искать это.

Ответы [ 2 ]

3 голосов
/ 30 марта 2009

На уровне базы данных решение будет иметь:

Val(Id)
Bar(Id)
BarToVal(IdBar, IdVal)
FooToVal(IdFoo, IdVal) 

Я не очень уверен, как они будут отображены. Может быть что-то вроде:

// BarMap:  
HasManyToMany(x => x.Vals).WithTableName("BarToVal");

// FooMap:  
HasManyToMany(x => x.Vals).WithTableName("FooToVal");

Надеюсь, это имеет смысл ...

2 голосов
/ 21 апреля 2009

Пример можно найти на кодовой странице Google для Fluent NHibernate .

Модель

public class Customer
{
    public string Name { get; set; }
    public string Address { get; set; }
}

Схема

table Customer (
    Id int primary key
    Name varchar(100)
)

table CustomerAddress (
    CustomerID int,
    Address varchar(100)
)

Mapping

public class CustomerMap : ClassMap<Customer>
{
    public CustomerMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);

        WithTable("CustomerAddress", m =>
        {
            m.Map(x => x.Address);
        });
    }
}

В этом примере сущность разделена на две таблицы в базе данных. Эти таблицы соединены один-к-одному на их ключах. Используя функцию WithTable, вы можете указать NHibernate рассматривать эти две таблицы как одну сущность.

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