Карта привязки NHibernate к нескольким таблицам, использующим один и тот же идентификатор? - PullRequest
1 голос
/ 19 января 2012

Я хочу сделать следующее, представьте сценарий, в котором у вас есть объект:

public class ObjectA {
    public virtual Guid Id;
    public virtual string PropertyA;
    public virtual string PropertyB;
    public virtual string PropertyC;
    public virtual string PropertyD;
}

И по причинам, в которые я не буду вдаваться, база данных должна выглядеть следующим образом:

----
Table: ObjectABase
----
Column Id
Column PropertyA
Column PropertyB
----

----
Table: ObjectAExtended
----
Column Id
Column PropertyC
Column PropertyD
----

Объект разделен между обеими таблицами и на него ссылается один и тот же идентификатор, поэтому при вызове Session.Save(... он будет сохранен в обеих таблицах.

Кто-нибудь есть идеи, как это сделать или дажевозможно?

Приветствия.

РЕДАКТИРОВАТЬ: Я выяснил ответ, но не могу опубликовать его в течение еще 7 часов, очевидно.Завтра обновлю.

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Я понял это. В NHibernate 3.2 используя карту по коду ...

public class ObjectAMap : ClassMapping<ObjectA> {
    public ObjectAMap () {
        Table("ObjectABase");
        Id<Guid>(x => x.Id, m => { m.Column("Id"); });
        Property(x => x.PropertyA, map => { map.Column("PropertyA"); });
        Property(x => x.PropertyB, map => { map.Column("PropertyB"); });
        Join("ObjectA",
             m => {
                 m.Table("ObjectAExtended");
                 m.Key(x => { x.Column("Id"); });
                 m.Property<string>(x => x.PropertyC, map => { map.Column("PropertyC"); });
                 m.Property<string>(x => x.PropertyD, map => { map.Column("PropertyD"); });
             });

        }); 
    }
}
1 голос
/ 20 января 2012

Одной из возможностей было бы использование элемента присоединенного подкласса в отображении nhibernate.Вы можете расположить ваши объекты следующим образом:

public class ObjectABase
{
   public virtual int Id {get; set;}
   public virtual string PropertyA {get; set}  
   public virtual string PropertyB {get; set}  
}

public class ObjectA : ObjectABase
{
   public virtual string PropertyC {get; set}  
   public virtual string PropertyD {get; set}    
}

, а затем настроить отображение следующим образом:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="Company.DomainModel">
  <joined-subclass name="ObjectA" table="ObjectAExtended" extends="Company.DomainModel.ObjectABase" lazy="false">
    <key column="Id" />
    <property name="PropertyC" />
    <property name="PropertyD" />
  </joined-subclass>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Company.DomainModel" assembly="DomainModel">
  <class name="ObjectABase" table="ObjectABase" lazy="false">
    <id name="Id" column="Id">
      <generator class="identity"/>
    </id>
    <property name="PropertyA" />
    <property name="PropertyB" />
  </class>
</hibernate-mapping>

Отключив ленивую загрузку, вы можете получить все избаза данных за один раз.

Это не совсем то, что вы указали в своем вопросе, поскольку свойства ObjectA определены как в ObjectA, так и в унаследованном базовом объекте, но для вашего приложения практических отличий может не быть.

...