Свободный компонент nhibernate один ко многим - PullRequest
0 голосов
/ 23 ноября 2010

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

public class A
{
    public virtual Guid Id { get; private set; }
    public virtual ComponentClass Component { get; set; }
}

public class ComponentClass 
{
    public virtual IList<B> Elements { get;set; }
}

public class B
{
    public virtual Guid Id { get; private set; }
    public virtual DateTime Time { get; set; }
}

Я отображаю их с помощью таких отображений:

public class AMap : ClassMap<A> 
{
    public A() {
        Id(x => x.Id);
        Component(x => x.Component,
                  c => c.HasMany(x => x.Elements).Inverse().Cascade.All());
    }
}

public class BMap : ClassMap<B>
{
    public B() {
        Id(x => x.Id);
        Map(x => x.Time);
    }
}

Когда я сохраняю свою сущность, я сопоставляю класс A одной таблице, а класс B - другой, как и ожидалось. Но у меня есть нули в столбце Component_id. Можете ли вы сказать мне, что мне здесь не хватает?

Ответы [ 3 ]

1 голос
/ 23 ноября 2010

Хорошо, я решил свою проблему - я могу использовать Id своего "родительского" класса. Таким образом, отображение компонентов станет:

public class AMap : ClassMap<A> 
{
    public A() {
        Id(x => x.Id);
        Component(x => x.Component,
                  c => c.HasMany(x => x.Elements).Cascade.All().Column("Id"));
    }
}

Так очевидно, когда я смотрю на это сейчас ... но мне потребовался час.

1 голос
/ 23 октября 2017

Если у вас есть связь «один ко многим» непосредственно с набором компонентов (т. Е. Без оболочки ComponentClass согласно вопросу), то вы можете отобразить ее напрямую:

HasMany(x => x.Elements)
    .AsSet()
    .Table("ElementTable")
    .KeyColumn("KeyColumn")
    .Cascade.All()
    .Component(x =>
    {
        x.Map(c => c.Id);
        x.Map(c => c.Time);
    })
    .LazyLoad();
1 голос
/ 23 ноября 2010

Я полагаю, что компоненты должны находиться в одной таблице, как четко указано в посте Ayende в блоге , поскольку они служат только для того, чтобы данные лучше отображались в виде объектной модели.Обязательно прочитайте его блог, возможно, это один из лучших ресурсов nHibernate.

...