سؤال

لدي العديد من-إلى-واحد العلاقة بين الكائنات Product و Supplier.أنا بحاجة إلى أن تكون قادرة على حذف Supplier دون حذف Products التي تنتمي إليها.

هنا هو نسخة مبسطة من الطبقات:

public class Supplier {
    public virtual IList<Product> Products { get; protected set; }
}

public class Product {
    // Product belongs to a Category but Supplier is optional
    public virtual Supplier Supplier { get; set; }
    public virtual Category Category { get; set; }
}

أنا باستخدام FluentNHibernate ، ولكن هنا هي تعيينات وتنتج:

<bag name="Products" cascade="save-update" inverse="true">
      <key column="SupplierID" />
      <one-to-many class="Me.Product, Me, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>

<many-to-one name="Supplier" column="SupplierID" />

وهذا يخلق المفتاح الخارجي في الجدول "منتجات" ، حتى عندما أحاول القيام مباشرة حذف على المورد أنا على قيد المفتاح الخارجي خطأ.حاولت تغيير تتالي أن 'جميع', على أمل أنه قد حذف العلاقة ، ولكن حذف جميع المنتجات الأخرى المرتبطة بها الكائنات.

الطريقة الوحيدة التي أستطيع أن أرى أن حل هذه الآن هو تكرار المنتجات مجموعة من المورد و تعيين المورد الممتلكات إلى null.هل هناك طريقة يمكنني تحقيق هذا السلوك من خلال الخرائط?

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

المحلول

تعيين خصائص نافذة إلا عندما الكيان هو في الواقع تحميل, وعندما كنت لا الاستعلام من خلال HQL.وعلى سبيل المثال ، إذا قمت بتحديد Cascade=ALL, إذا قمت بحذف مورد مع الاستعلام "delete from Supplier where id=:id", سوف تحصل على الأرجح نفس FK القيد الفشل, لأن hql لا الزناد (البرنامجي) شلالات.

يبدو أن المنتجات هي امتلاك الجانب من العلاقة ، وهو أمر جيد.أعتقد أن لديك خيارين:

  • شفرة طريقة على المورد تكرار خلال كافة المنتجات و تعيين المنتج المورد إلى null, و استخدام هذا الأسلوب قبل حذف أي مورد
  • قبل إصدار المورد حذف ، تأكد داو مجموعات المنتج المورد إلى null

على سبيل المثال:

public int Delete(Supplier s) {
    return Session.CreateQuery("udpate Product set Supplier = null where Supplier = :supplier")
        .SetParameter("supplier", s)
        .ExecuteUpdate();
}

نصائح أخرى

لا تفعل هذا.

لديك ضمنية أو صريحة التأكيد في النموذج الخاص بك أن جميع المنتجات لديها المورد.المفتاح الخارجي هو هناك لفرض هذا الشرط.إزالة المورد مع الحفاظ على المنتجات ينتهك النموذج الخاص بك سوف ربما يسبب الكثير من التعليمات البرمجية التي تعتمد على هذا دائما صحيح أن تفشل.

الشيء الوحيد الذي يمكنك القيام به ، كنت قد اكتشفت بالفعل:كل منتج يحتوي هذا المورد ، يمكنك تعيين المنتج المورد null.هذا لن تنتهك حالتك, لكنه نفسه قائلا "لا نعرف من المورد هذا المنتج" و قد يسبب رمز الفشل.

لماذا تريد أن تفعل هذا ؟

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