2011-05-29 15 views
5

In his blog, Ayende, bire bir kullanma olasılığının geleneksel bir 1: 1 nesne ilişkisini (örneğin, customer.Name ==) uygulamasının en iyi yolu olmadığını öne sürer. name.Customer).NHibernate one-to-one 2 çoktan-bire

  1. Bire bir ilişkiyi ne zaman kullanacağımı nasıl seçerim?
  2. Neden seçmeliyim 2 bire birçok bire-bir eser (hayır FK sütunlar oluşturulan vardır) nasıldır ilişkilerinde

Bire bir:

One-to-one

2 çok-on:

enter image description here

+0

FK sütunları oluşturulmadığından emin misiniz? Benim için bunlar üretiliyor ve veritabanı, bire çok ilişkiyle göründüğü gibi görünüyor. Belki de her iki taraf için yanlışlıkla 'Invserse' kullandın? –

+0

Evet Eminim - Bire bir tablo, FK tuşu olmadan öğeye benziyor. – Darbio

+2

Bire bir yapmanın iki yolu vardır. Oluşturduğunuz şekilde, onları birleştirmek için her iki öğenin birincil anahtarlarını kullanır. İkinci durumda, benzersiz bir kısıtlamaya sahip yabancı bir anahtarınız var http://nhforge.org/doc/nh/en/index.html#mapping-declaration-onetoone – Vadim

cevap

2

Bire-çok eşleştirmeyi kullanmanın tek sebebi performans yüzünden.

Başlangıçta projeye performans sorunuyla çarpıncaya kadar bire bir gittim. Sorun genellikle, tersine bire bir eşleme için tembel yükleme yapamadığınızdan kaynaklanır. Örneğin. A (varsa) 'ye sahip olan bir varlığa sahip olduğunuzda, bu eşleme ile ilgili B varlığına sahip olursunuz. Bu durumda, yüklediğiniz her A öğesi için, B varlığı da yüklenir. İlgili nesne mevcut olup olmadığını kontrol ederek hatayı önlemek için yapılır. Tembel yükleme için vekil, ilgili varlık var olmadığını, siz bile olmadığına dair sizi yanıltmasın. Eğer bu gibi ilgili varlık bulunmadığını kontrol Eğer geç yükleme sorun yok, ancak bir tane çoğa haritalama kullanıyorsanız geliştirici bir koleksiyon ile çalışıyor, çünkü bir sorun

if (entityA.EntityB == null) HandleNoEntityB(); 

olacak olan biz için proxy oluştur.

if (entityA.EntitiesB.Count == 0) HandleNoEntityB(); 

Bu varlık bir zaman bu durumda tam olarak bir ilgili varlık B. sahiptir sisteminizde bir varsayımda bulunmak eğer bir sorun olmak zorunda değildir, bunun üzerine contrained = "true" belirlesin haritalaması.