свободный компонент nhibernate один ко многим

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

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. Можете ли вы сказать мне, что мне здесь не хватает?


person coding4beer    schedule 22.11.2010    source источник
comment
Хорошо, я решил свою проблему - я могу использовать Id моего родительского класса. Таким образом, сопоставление компонентов станет следующим: c.HasMany(x => x.Elements).Cascade.All().Column(Id);   -  person coding4beer    schedule 23.11.2010


Ответы (3)


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

person ChrisAnnODell    schedule 22.11.2010

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

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"));
    }
}

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

person coding4beer    schedule 22.11.2010
comment
Это даст вам только отношение один к одному, поскольку вы явно сопоставляете компонент с его родителем через одно и то же значение идентификатора, то есть Parent.1 => Component.1, Parent.2 => Component.2 - person ChrisAnnODell; 23.11.2010
comment
Кроме того, у вас больше нет объекта-значения, теперь у вас есть сущность, которая наследует идентичность родителя. Если у вас entity.Id = 1 и entity.Id = 2, и у обоих есть объект значения, который имеет одинаковое значение, каждый компонент должен быть взаимозаменяемым по определению, но это больше не так — теперь у вас есть Component.1 и Component .2. Можно правильно сопоставить коллекцию компонентов, но NHibernate не позволяет совместно использовать компоненты, т. е. не один ко многим или компонент, содержащий коллекцию, такую ​​как вы определили здесь. См. docs.jboss.org/hibernate/core/3.3. /ссылка/en/html/ - person Sisyphus; 23.11.2010

Если у вас есть ассоциация «один ко многим», прямая для набора компонентов (т.е. без оболочки 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();
person Marcus Denny    schedule 22.10.2017