سؤال

أنا باستخدام بطلاقة NHibernate وجود بعض المسائل في الحصول على العديد من العديد من علاقة الإعداد مع أحد دروسي.ربما خطأ غبي ولكن لقد كان عالقة قليلا في محاولة للحصول على عمل.على أي حال, لدي بعض الفئات التي لها العديد من العديد من العلاقات.

public class Person
{
    public Person()
    {
        GroupsOwned = new List<Groups>();
    }

    public virtual IList<Groups> GroupsOwned { get; set; }
}

public class Groups
{
    public Groups()
    {
        Admins= new List<Person>();
    }

    public virtual IList<Person> Admins{ get; set; }
}

مع رسم الخرائط يبحث مثل هذا

الشخص:...

HasManyToMany<Groups>(x => x.GroupsOwned)
    .WithTableName("GroupAdministrators")
    .WithParentKeyColumn("PersonID")
    .WithChildKeyColumn("GroupID")
    .Cascade.SaveUpdate();

المجموعات:...

 HasManyToMany<Person>(x => x.Admins)
    .WithTableName("GroupAdministrators")
    .WithParentKeyColumn("GroupID")
    .WithChildKeyColumn("PersonID")
    .Cascade.SaveUpdate();

عند تشغيل اختبار التكامل ، أساسا أنا خلق شخص جديد المجموعة.إضافة مجموعة إلى الشخص.GroupsOwned.إذا كنت تحصل على شخص كائن من مستودع ، GroupsOwned يساوي المجموعة الأولي, ومع ذلك ، عندما أحصل على المجموعة مرة أخرى إذا كنت تحقق الاعتماد على المجموعة.مدراء ، العد من 0.الانضمام الجدول وقد GroupID و PersonID المحفوظة في ذلك.

شكرا على أي نصيحة قد تكون لديك.

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

المحلول

حقيقة أن يتم إضافة اثنين من السجلات إلى الجدول يبدو أن كنت في عداد المفقودين معكوس السمة.لأن كل شخص في المجموعة يتم تغييرها ، NHibernate هو استمرار العلاقة مرتين (مرة واحدة لكل كائن).معكوس سمة على وجه التحديد لتجنب هذا.

أنا غير متأكد حول كيفية إضافته في رسم الخرائط في كود لكن الرابط يظهر كيفية القيام بذلك في XML.

نصائح أخرى

@سانتياغو أعتقد أنك على حق.

الجواب قد يكون مجرد أن تحتاج إلى إزالة واحد من ManyToMany الإعلانات تبحث أكثر في يجيد يبدو أنه قد يكون ذكيا بما يكفي فقط تفعل ذلك بالنسبة لك.

هل أنت مع التأكد من إضافة الشخص إلى مجموعات.المسؤول ؟ لديك لجعل كل الروابط.

لديك ثلاثة جداول صحيح ؟

الناس والمجموعات GroupAdministrators

عند إضافة إلى كلا الجانبين يمكنك الحصول على

الناس (مع معرف من p1) المجموعات (مع معرف من g1)

و في GroupAdministrators لديك اثنين من أعمدة جدول يحتوي على

(p1,g1)

(p1,g1)

و اختبار الوحدة البرمجية تبدو كما يلي.

Context hibContext //Built here
Transaction hibTrans //build and start the transaction.

Person p1 = new Person()
Groups g1 = new Groups()

p1.getGroupsOwned().add(g1)
g1.getAdmins().add(p1)

hibTrans.commit();
hibContext.close();

ثم في الاختبار الخاصة بك يمكنك جعل سياق جديد ، اختبار لمعرفة ما هو في السياق ، على الصواب لكن الجداول الخاصة بك هي كل ملوث ؟

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