سؤال

ودعونا نقول لدي نموذج المجال مع فئة تسمى مدونة يحتوي على خاصية تسمى BlogEntries (الذي يحتوي على كائنات من نوع المدونة بعنوان). إذا كان لدي نموذج قاعدة البيانات مع جدولين "مدونة" و "المدونة بعنوان"، فإنه ليس من المستحيل أن لدي 1000 بلوق لبلوق. إذا كان لي أن تظهر بلوق على موقع على شبكة الإنترنت، وأريد فقط لعرض وربما 20 إدخالات بلوق في وقت واحد، لذلك أود أن تضطر إلى استخدام نوع من الترحيل. من الواضح أنني لا أريد 1000 السجلات إلى أن جلب من DB في كل وقت.

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

ومدونة / هو مجرد مثال، فإنه يمكن أن يكون المدونة بعنوان الشيء فقط، وكذلك على العملاء / طلب سبيل المثال أو أي سيناريو رئيسي / تفاصيل أخرى.

يرجى تنورني!

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

المحلول

وأود أن جعل المدونة بعنوان انها الجذر الكلي بها، مع انها مستودع الخاصة. سوف تحصل حالات المدونة بعنوان لمدونة خاصة عن طريق الاستعلام عن مستودع المدونة بعنوان لجميع من المدونة بعنوان التي لديها BlogID معين. لا أستطيع تقديم تفاصيل عن مستودع أبعد من ذلك لأن هناك العديد من الاستراتيجيات المختلفة لتنفيذ المستودعات (مستودع عام واحد مقابل عديدة، طرق مكتشف منفصلة مقابل واحد أن يأخذ كائن مواصفات معقدة، الخ). طريقة مكتشف للمستودع أن تدعم الترحيل.

public class Blog
{
    public int ID {get;set;}
    // other stuff
}

public class BlogEntry
{
    public int ID {get;set;}
    public int BlogID {get;set;}
}

public class BlogEntryRepository
{
    public IEnumerable<BlogEntry> FindByBlogID(
        int blogID, int pageIndex, int pageSize) 
    {
        // implementation
    }
}

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

public class Blog
{
    public int ID {get;set;}
    public IEnumerable<int> BlogEntryIDs {get;set;}
    // other stuff
}

public class BlogEntry
{
    public int ID {get;set;}
    public int BlogID {get;set;}
}

public class BlogEntryRepository
{
    public IEnumerable<BlogEntry> Get(IEnumerable<int> blogEntryIDs) 
    {
        // implementation
    }
}

واستخدام لهذا النهج من شأنه أن يكون مثل

// get the second page
var entries = 
  blogEntryRepo.Get(blog.BlogEntryIDs).Skip(1 * PAGE_SIZE).Take(PAGE_SIZE);

في قاعدة البيانات، هل يعود صفوف متعددة، واحد لكل دخول بلوق. (أنا أفضل أيضا للعودة نتيجة عدة مجموعات للحصول على كافة الصفوف من جميع الجداول المرتبطة في قاعدة بيانات واحدة ذهابا وإيابا. أنا أيضا الاستفادة من وظيفة ROW_VERSION SQL 2005 لتمكين ترحيل قاعدة البيانات.)

وعموما أنا أفضل الطريقة الثانية، ما لم يظهر الاستخدام العادي كميات الباهظة لل(أكثر مثلا من بضعة آلاف) الحالات المدونة بعنوان المرتبطة المدونة. أن مجموعة من عدد كبير جدا من لكثافة العمليات تجعلني الحذر من أداء والذاكرة.

نصائح أخرى

لديك للوصول إلى المدونة بعنوان في انها مستودع الخاصة للحصول على قائمة ترحيلها.

وتحرير: لماذا downvote؟ هل هذا خطأ؟

لجمع مداخل بلوق هل يمكن استخدام BatchSize و السمة . وسوف تتيح لك لا لتحديد كافة جمع من قاعدة البيانات، القيم المطلوبة فقط.

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