Tabel Nhibernate Multiple memiliki hubungan Satu ke banyak ke tabel tertentu

Saya punya tabel sebut saja A. A memiliki bidang - objId.

Ada tabel lain sebut saja B, C dan D. yang memiliki daftar record A. Catatan harus dibuat dengan menambahkan catatan A ke daftar catatan A dari salah satu tabel B, C dan D. Bidang objId harus berupa PK (id) dari catatan B/C/D Siapa yang memiliki daftar tersebut dari A.

yang dimaksud - objId adalah FK ke banyak tabel. Saya mulai dengan tabel B. Namun setelah tabel B dibuat, bidang objId dari tabel A dibuat. dan sekarang ada apa dengan tabel C dan D? Mereka tidak dapat membuat lagi objek kolom dalam sebuah tabel.

Kodenya adalah:

<id name="Id">
  <generator class="guid" />
</id>

<bag name="As" cascade="All">
  <key column="ObjId" />
  <one-to-many class="A" />
</bag>

<class name="A">
<id name="Id">
  <generator class="guid" />
</id>
<property name="ObjId" />

public class B
{
    public virtual Guid Id { get; set; }
    public virtual IList<A> As{ get; set; }
}

public class A
{  
    public virtual Guid Id { get; set; }
    public virtual string ObjId { get; set; }
}

menambahkan catatan A ke B:

       this.Update(session =>
       {
           var bRecord = ....;

           bRecord.As.Add(new ARecord {
                 ...
          });

             session.Update(bRecord);
       });

Bagaimana saya perlu membuat asosiasi yang benar?


person Shir    schedule 20.03.2014    source sumber


Jawaban (1)


Secara umum, ada lebih banyak cara untuk menangani skenario ini - masing-masing cara memerlukan beberapa penyesuaian/perluasan. Yaitu. Anda tetap harus mengubah struktur DB Anda

Jika instance A dapat direferensikan oleh masing-masing B, C, D, satu-satunya cara adalah dengan memasukkan kolom kunci asing BObjectId, CObjectId, DObjectId.

Jika instance A dapat digunakan secara eksklusif oleh salah satu dari mereka (B, C, D) kita memerlukan kolom baru, sebut saja Discriminator

<class name="A">
  <id name="Id" generator="guid" />
 <property name="ObjId" />
 <property name="Discriminator" />
</class>

Sekarang, kita harus mengisi nilai dengan benar ke dalam Diskriminator di Kode C# kita. Jika A ditugaskan ke B, kita harus mengisi 'B'

var a = new A();
b.AddA(a);

dimana implementasinya harus seperti ini.

public virtual void AddA(A a)
{
    As.Add(a);
    a.ObjectId = this.ID
    a.Discriminator = 'B'
}

CATATAN: dalam hal ini, kami menetapkan ID ke ObjectId. Ini berfungsi, tetapi hanya jika ID sudah ditetapkan. Ini tidak akan berfungsi jika objek B bersifat sementara, dengan nilai ID default. Dalam hal ini kita perlu membuat beberapa solusi. Misalnya. Flush() B lalu tetapkan referensinya...

Jadi, kami berhasil mengelola/mengisi/memasukkan nilai Diskriminator dengan benar ke dalam instance/record A. Sekarang kita dapat menggunakannya juga untuk pemetaan. Pemetaan tas B, C, D akan sangat mirip:

<class name="A">
  <bag name="As" cascade="All" batch-size="25"
    where=" Discriminator = 'B' " >
      <key column="ObjId" />
      <one-to-many class="A" />
  </bag>

where=" Discriminator = 'B' " adalah cara NHibernate yang bagus untuk memasukkan filter ke dalam koleksi kita. Terapkan hal yang sama untuk C, D... dan ...

person Radim Köhler    schedule 21.03.2014
comment
Terima kasih banyak atas bantuan Anda. Seperti yang Anda katakan- 'Secara umum, ada lebih banyak cara untuk menangani skenario ini'. Apakah mereka? Apakah cara Anda menulis adalah cara terbaik? - person Shir; 24.03.2014
comment
Bagus jika itu membantu. Nikmati NHiberante ;) - person Radim Köhler; 24.03.2014