2008-09-28 14 views
8

Bazı mülklerde IList olarak yeni nesneler içeren yeni bir nesnem var. Ben sql profiler iki ekleme sorguları yürütülürken görüyorum .. biri için yeni bir rehber kimliği olan ebeveyn için bir tane ve bir tane için çocuk, ancak, anne-babaya başvuran çocuğa yabancı anahtar, boş bir kılavuz. İşte ebeveyn benim haritalama geçerli:Niçin NHibernate çanta koleksiyonum, çocukların 'ebeveyn kimliği' ni dinamik olarak ayarlıyor?

<id name="BackerId"> 
    <generator class="guid" /> 
</id> 
<property name="Name" /> 
<property name="PostCardSizeId" /> 
<property name="ItemNumber" /> 

<bag name="BackerEntries" table="BackerEntry" cascade="all" lazy="false" order-by="Priority"> 
    <key column="BackerId" /> 
    <one-to-many class="BackerEntry" /> 
</bag> 

Backer.cs sınıfında, ben

IList<BackerEntry> 

ben varlık geçirilen SaveOrUpdate çalışırken BackerEntries özelliği tanımlı sql aşağıdaki sonuçlar elde profil:

exec sp_executesql N'INSERT İÇİNE Backer (Ad, PostCardSizeId, ItemNumber, BackerId) DEĞERLERİ (@ p0, @ p1, p2 @ @ p3) 'N' 'p0 nvarchar (3), @ p1 uniqueidentifier , @ p2 nvarchar (3), @ p3 benzersiz belirleyici ', @ p0 = N'qaa', @ p1 = 'BC95E7EB-5EE8-44B2-82FF3 0F5176684D '@ p2 = N'qaa', @ p3 = '18FBF8CE-FD22-4D08-A3B1-63D6DFF426E5'

exec Sp_executesql N'INSERT İÇİNE BackerEntry (BackerId, BackerEntryTypeId, Ad, Açıklama, MaxLength, IsRequired Öncelikli , BackerEntryId) VALUES (@ p0, @ p1, @ p2, @ p3, @ p4, @ p5, @ p0 benzersiz belirleyici, @ p1 benzersiz belirleyici, @ p2 nvarchar (5), @ p3 nvarchar (5), @ p4 int, @ p5 bit, @ p6 int, @ p7 benzersiz belirleyici ', @ p0 =' 00000000-0000-0000-0000-000000000000 ', @ p1 =' 2C5BDD33-5DD3-42EC-AA0E-F1E548A5F6E4 '@ p2 = N'qaadf', @ p3 = N'wasdf', @ p4 = 0 @ P5 = 1, @ p6 = 0, @ p7 = 'FE9C4A35-6211-4E17-A75A-60CCB526F1CA'

Gördüğünüz gibi, çocuğun BackerId için boş kılavuzunu üst öğenin yeni gerçek kılavuzuna sıfırlamıyor.

Son olarak, istisna atmak:

"NHibernate.Exceptions.GenericADOException: could not insert: [CB.ThePostcardCompany.MiddleTier.BackerEntry][SQL: INSERT INTO BackerEntry (BackerId, BackerEntryTypeId, Name, Description, MaxLength, IsRequired, Priority, BackerEntryId) VALUES (?, ?, ?, ?, ?, ?, ?, ?)] ---\u003e System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint 

DÜZENLEME: ÇÖZÜLDÜ! Aşağıdaki ilk cevap beni doğru yöne işaret etti. Çocuk haritalaması ve sınıfına bu geri referansı eklemem gerekiyordu. Bu, tamamen .net bir şekilde çalışmasına izin verdi - ancak json'u kabul ederken, bir bağlantı kesildi, bu yüzden çocukları yeniden “takmak” için bazı ilginç kodlar bulmak zorunda kaldım.

cevap

9

Sen haritalama sınıfına-NOT NULL = "true" eklemeniz gerekebilir:

<bag name="BackerEntries" table="BackerEntry" cascade="all" lazy="false" order-by="Priority"> 
    <key column="BackerId" not-null="true"/> 
    <one-to-many class="BackerEntry" /> 
</bag> 

yanı sıra çocuk sınıf için tanımlanmış haritalama tersine sahip olduğundan emin olun:

<many-to-one name="parent" column="PARENT_ID" not-null="true"/> 

Geçerli projemde ebeveyn-çocuk ilişkileri ile benzer sorunlarla karşılaştım ve bu çözümün bir parçasıydı.

+0

Teşekkür ederim .. Beni doğru yönde işaret ettin ... Çocuk haritalamada arka referansa sahip değildim. – EvilSyn

0

Bu problemi yaşadım ve her zaman anlamaya karar verdim. Çocuk masasının üst yabancı anahtarında boş değerlere izin vermesi gerekir. NHibernate, yabancı anahtar sütunundaki NULL ile çocukları kurtarmayı ve ardından geri dönüp doğru ParentId ile güncelleştirmeyi sever.

+1

Bu doğru mu ??? – Dan

+1

kesinlikle doğru değil, iki yönlü bir ilişkiyi eşleştirmeniz gerekir, böylece ters uç ebeveyntir ve her iki tarafa da özellikler ayarlanır. http://www.nhforge.org/doc/nh/en/index.html#collections-bidirectional – dotjoe

+0

+1. Evet bu doğru. Çocuk masasındaki FK sütununun çalışması için nemli olması gerekir.NHibernate, çocuğa NULL olarak ayarlanmış olan ParentID'yi ekler ve daha sonra, Ana veri tabanı veritabanına kaydedildiğinde, ParentID'yi günceller. –