لماذا لا تقوم مجموعة حقائب NHibernate الخاصة بي بتعيين "معرف الوالدين" للأطفال ديناميكيًا؟

StackOverflow https://stackoverflow.com/questions/146604

سؤال

لدي كائن جديد يحتوي على مجموعة من الكائنات الجديدة بداخله في بعض الممتلكات باعتباره IList.أرى من خلال ملف التعريف SQL استعلامات إدراج يتم تنفيذها ..واحد للأصل، الذي يحتوي على المعرف الإرشادي الجديد، والآخر للطفل، ومع ذلك، فإن المفتاح الخارجي الموجود على الطفل الذي يشير إلى الأصل، هو مرشد فارغ.هنا هو رسم الخرائط الخاص بي على الوالدين:

<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، قمت بتعريف خاصية BackerEntries على أنها

IList<BackerEntry>

عندما أحاول SaveOrUpdate للكيان الذي تم تمريره، أحصل على النتائج التالية في ملف تعريف SQL:

exec sp_executesql n'Insert في Backer (name ، postcardsizeId ، itemNumber ، backerid) القيم (@p0 ،@p1 ،@p2 ،@p3) '، n'@p0 nvarchar (3) ،@p1 فريد من نوعه ،@p2 nvarchar (3) ) ،@p3 فريدة من نوعها '،@p0 = n'qaa' ،@p1 = 'bc95e7eb-5EE8-44B2-82FF30F5176684D' ،@p2 = n'qaa '،@p3 =' 18FBF8CE-FD22-4D08-A3B1-63DFF426DFF '

exec sp_executesql N'INSERT INTO BackerEntry (BackerId، BackerEntryTypeId، الاسم، الوصف، MaxLength، IsRequired، الأولوية، BackerEntryId) القيم (@p0، @p1، @p2، @p3، @p4، @p5، @p6، @p7) ',N'@p0 Uniqueidentifier,@p1 Uniqueidentifier,@p2 nvarchar(5),@p3 nvarchar(5),@p4 int,@p5 bit,@p6 int,@p7 Uniqueidentifier',@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'

كما ترون، لا يتم إعادة تعيين المرشد الفارغ لـ BackerId الموجود على الطفل إلى المرشد الحقيقي الجديد للوالد.

أخيرًا، الاستثناء هو:

"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

يحرر:تم حلها!الإجابة الأولى أدناه وجهتني إلى الاتجاه الصحيح.كنت بحاجة إلى إضافة هذا المرجع الخلفي في تعيين الطفل والفصل الدراسي.وهذا سمح له بالعمل بطريقة .net بحتة - ومع ذلك، عند قبول json، كان هناك انقطاع في الاتصال لذا اضطررت إلى التوصل إلى بعض التعليمات البرمجية الغريبة "لإعادة ربط" الأطفال.

هل كانت مفيدة؟

المحلول

قد تحتاج إلى إضافة NOT-NULL="true" إلى فئة التعيين الخاصة بك:

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

وكذلك التأكد من أن لديك عكس التعيين المحدد للفئة الفرعية:

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

لقد واجهت مشكلات مماثلة مع السبات في مشروعي الحالي المتعلق بالعلاقات بين الوالدين والطفل، وكان هذا جزءًا من الحل.

نصائح أخرى

لقد واجهت هذه المشكلة واستغرق الأمر مني إلى الأبد لمعرفة ذلك.يجب أن يسمح الجدول الفرعي بالقيم الخالية على المفتاح الخارجي الأصلي الخاص به.يحب NHibernate حفظ الأطفال باستخدام NULL في عمود المفتاح الخارجي ثم العودة والتحديث باستخدام ParentId الصحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top