سؤال

تحرير #2: السؤال حلها halfways.انظر أدناه

متابعة السؤال ، لا أحد يعرف من غير تدخلية طريقة لحل ما أحاول فعله أدناه (أي ربط الكائنات إلى بعضها البعض دون إحداث حلقات لانهائية)?


أنا في محاولة لخلق asp.صافي-mvc تطبيق ويب على StackOverFlowException.وحدة تحكم بتشغيل الأمر التالي:

    public ActionResult ShowCountry(int id)
    {
        Country country = _gameService.GetCountry(id);
        return View(country);
    }

على GameService يعالج مثل هذا (WithCountryId هو امتداد):

    public Country GetCountry(int id)
    {
        return _gameRepository.GetCountries().WithCountryId(id).SingleOrDefault();
    }

على GameRepository يعالج مثل هذا:

    public IQueryable<Country> GetCountries()
    {
        var countries =  from c in _db.Countries
               select new Country
               {
                   Id = c.Id,
                   Name = c.Name,
                   ShortDescription = c.ShortDescription,
                   FlagImage = c.FlagImage,
                   Game = GetGames().Where(g => g.Id == c.GameId).SingleOrDefault(),
                   SubRegion = GetSubRegions().Where(sr => sr.Id == c.SubRegionId).SingleOrDefault(),
               };
        return countries;
    }

على GetGames() طريقة يسبب StackOverflowException:

    public IQueryable<Game> GetGames()
    {
        var games = from g in _db.Games                   
               select new Game
               {
                   Id = g.Id,
                   Name = g.Name

               };
        return games;

    }

عملي كائنات مختلفة من linq2sql فصول هذا هو السبب في أنني ملء لهم مع تحديد الجديدة.

حدث استثناء غير معالج من النوع 'System.StackOverflowException' حدث في mscorlib.dll


تحرير #1: لقد وجدت الجاني ، إنها الطريقة التالية ، فإنه يؤدي GetCountries (طريقة) التي في المقابل يؤدي GetSubRegions() مرة أخرى ، الغثيان:

    public IQueryable<SubRegion> GetSubRegions()
    {
        return from sr in _db.SubRegions
               select new SubRegion
               {
                   Id = sr.Id,
                   Name = sr.Name,
                   ShortDescription = sr.ShortDescription,
                   Game = GetGames().Where(g => g.Id == sr.GameId).SingleOrDefault(),
                   Region = GetRegions().Where(r => r.Id == sr.RegionId).SingleOrDefault(),
                   Countries = new LazyList<Country>(GetCountries().Where(c => c.SubRegion.Id == sr.Id))
               };
    }

قد تضطر إلى التفكير في شيء آخر هنا :) هذا ما يحدث عندما تفكر في OO عقلية بسبب الكثير من القهوة

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

المحلول

قد تكون المشكلة هذه:البلدان فرعية و فرعية لها البلدان.أنا لا أعرف كيف يمكنك تنفيذ كسول قائمة ، ولكن قد تبقى الدعوة GetCountries ثم GetSubRegions وهلم جرا.لمعرفة ذلك, وأود أن إطلاق المصحح ar تعيين نقاط إيقاف في GetCountries و GetSubRegions طريقة رؤوس.

حاولت أنماط مماثلة مع LinqToSql ، ولكن من الصعب جعل ثنائي الاتجاه الملاحة العمل دون التأثير على الأداء كثيرا.هذا هو واحد من الأسباب أنا باستخدام NHibernate الآن.

نصائح أخرى

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

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

العامة كائن MyProperty { set { MyProperty = القيمة ؛ }}

أسهل إلى المكان حالات مثل لك ، حيث الأسلوب المكالمات ب الأسلوب الذي يدعو الأسلوب ، لأنك يمكن أن نرى نفس الأساليب تظهر اثنين أو أكثر من مرة في مكدس الاستدعاءات.

للرد على تحريرها السؤال وهي:"ربط الكائنات إلى بعضها البعض دون إحداث حلقات لانهائية":

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

الخيار 1:

  • جلب جميع البلدان (ترك الفرعية فارغة)
  • جلب جميع المناطق دون الإقليمية (ترك البلدان فارغة)
  • لكل المنطقة ، تبدو من خلال قائمة البلدان إضافة إلى المنطقة دون الإقليمية البلد البلد إلى المنطقة

الخيار 2:

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

(أو عكس البلد و المنطقة)

هم في الأساس equialent إجابات يتغير عندما كنت تفعل بعض من ربط.

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