6

संपादित करें: Updated समस्या परीक्षण पर आधारित विवरण - 12 सितं, 2011ईएफ 4.1 एकाधिक नेस्टेड इकाई शामिल नहीं है समर्थित नहीं है?

मैं जब भी मैं .ToList फोन() इस क्वेरी है कि एक NotSupportedException फेंकता है ("निर्दिष्ट विधि समर्थित नहीं है।")।

IQueryable<FileDefinition> query = db 
    .FileDefinitions 
    .Include(x => x.DefinitionChangeLogs) 
    .Include(x => x.FieldDefinitions.Select(y => y.DefinitionChangeLogs)) // bad 
    .Include(x => x.FieldDefinitions.Select(y => y.FieldValidationTables)) // bad 
    .Where(x => x.IsActive); 
List<FileDefinition> retval = query.ToList(); 

अगर मैं या तो लाइन है कि मैं के रूप में "बुरा" टिप्पणी की है बाहर टिप्पणी, फिर क्वेरी काम करता है। मैंने अपने ऑब्जेक्ट मॉडल में एक ही प्रभाव के साथ विभिन्न नेस्टेड इकाइयों सहित भी कोशिश की है। किसी भी 2 सहित एक दुर्घटना का कारण बन जाएगा। नेस्टेड द्वारा, मेरा मतलब है नेविगेशन प्रॉपर्टी की नेविगेशन प्रॉपर्टी। मैंने स्ट्रिंग पथ के साथ विधियों को शामिल करने का भी प्रयास किया: एक ही परिणाम।

मेरे तालिका संरचना इस तरह दिखता है:

Db model

Db model 2

यह MySQL कनेक्टर/नेट 6.3.4 के साथ डेटाबेस स्टोर के रूप में MySQL 5.1 (InnoDB टेबल जाहिर है) का उपयोग कर रहा है।

तो मेरा सवाल है: यह क्यों काम नहीं करता है?

नोट: अगर मैं this link में संबंधित संस्थाओं को स्पष्ट रूप से लोड करता हूं तो मैं इसे काम पर ला सकता हूं। लेकिन मैं जानना चाहता हूं कि क्यों ईएफ मेरे डेटा मॉडल से नफरत करता है।

उत्तर: MySQL कनेक्टर जाहिरा तौर पर 2 नेस्टेड इकाई में शामिल हैं से निपटने में सक्षम नहीं है। यह NotSupportedException फेंकता है, नहीं .NET EF। यह वही त्रुटि तब भी मौजूद थी जब मैंने ईएफ 4.0 का उपयोग करके यह कोशिश की, लेकिन उस समय मेरे शोध ने मुझे विश्वास दिलाया कि यह समस्या पैदा करने वाली स्वयं-ट्रैकिंग संस्थाएं थीं। मैंने नवीनतम कनेक्टर को अपग्रेड करने का प्रयास किया, लेकिन यह Out of Sync error का कारण बन गया। MySQL से नफरत करने के लिए यह yet another reason है।

+0

क्या होता है यदि * केवल * उसमें शामिल करें जिसे आपने "खराब" के रूप में चिह्नित किया है और अन्य दो को शामिल किया है? क्या यह तब काम करता है? – Slauma

+0

@ स्लुमा हां, दूसरी पंक्ति स्वयं ही काम करती है। मैंने और परीक्षण किया, और ऐसा लगता है कि दूसरे और तीसरे के संयोजन में दुर्घटना का कारण बनता है। वे खुद से काम करते हैं, लेकिन एक साथ नहीं। FieldValidationTables संग्रह डेटाबेस में एक दृश्य से लोड किया गया है, और मुझे मैन्युअल रूप से ईएफ मॉडल में संबंध स्थापित करना पड़ा। इसमें फ़ील्डडिफिनिशन आईडी और टेबलनाम फ़ील्ड हैं। फील्डडिफिनशन 1 <-> * फ़ील्ड वैलिडेशनटेबल –

+0

मुझे नहीं पता कि यह समस्या क्या है। उत्तर पाने के लिए आपको शायद अपने प्रश्न में अधिक जानकारी जोड़नी होगी (मूल रूप से समस्या को सरल उदाहरण मॉडल में अन्य लोगों के लिए पुन: उत्पन्न करने के लिए)। – Slauma

उत्तर

2

मैं एक छोटे से सांत्वना आवेदन अपने परिदृश्य का परीक्षण करने और इस परीक्षण आवेदन कर दिया है काम करता है:

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 

namespace EFIncludeTest 
{ 
    public class Parent 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public ICollection<ChildLevel1> ChildLevel1s { get; set; } 
    } 

    public class ChildLevel1 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public ICollection<ChildLevel2a> ChildLevel2as { get; set; } 
     public ICollection<ChildLevel2b> ChildLevel2bs { get; set; } 
    } 

    public class ChildLevel2a 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class ChildLevel2b 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class MyContext : DbContext 
    { 
     public DbSet<Parent> Parents { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Create entities to test 
      using (var ctx = new MyContext()) 
      { 
       var parent = new Parent 
       { 
        Name = "Parent", 
        ChildLevel1s = new List<ChildLevel1> 
        { 
         new ChildLevel1 
         { 
          Name = "FirstChildLevel1", 
          ChildLevel2as = new List<ChildLevel2a> 
          { 
           new ChildLevel2a { Name = "FirstChildLevel2a" }, 
           new ChildLevel2a { Name = "SecondChildLevel2a" } 
          }, 
          ChildLevel2bs = new List<ChildLevel2b> 
          { 
           new ChildLevel2b { Name = "FirstChildLevel2b" }, 
           new ChildLevel2b { Name = "SecondChildLevel2b" } 
          } 
         }, 

         new ChildLevel1 
         { 
          Name = "SecondChildLevel1", 
          ChildLevel2as = new List<ChildLevel2a> 
          { 
           new ChildLevel2a { Name = "ThirdChildLevel2a" }, 
           new ChildLevel2a { Name = "ForthChildLevel2a" } 
          }, 
          ChildLevel2bs = new List<ChildLevel2b> 
          { 
           new ChildLevel2b { Name = "ThirdChildLevel2b" }, 
           new ChildLevel2b { Name = "ForthChildLevel2b" } 
          } 
         }, 
        } 
       }; 

       ctx.Parents.Add(parent); 
       ctx.SaveChanges(); 
      } 

      // Retrieve in new context 
      using (var ctx = new MyContext()) 
      { 
       var parents = ctx.Parents 
        .Include(p => p.ChildLevel1s.Select(c => c.ChildLevel2as)) 
        .Include(p => p.ChildLevel1s.Select(c => c.ChildLevel2bs)) 
        .Where(p => p.Name == "Parent") 
        .ToList(); 

       // No exception occurs 
       // Check in debugger: all children are loaded 

       Console.ReadLine(); 
      } 
     } 
    } 
} 

मेरे समझ गया था कि इस मूल रूप से अपने मॉडल और क्वेरी आप कोशिश कर रहे हैं (के लिए भी अपनी टिप्पणी लेने का प्रतिनिधित्व करता है आपका प्रश्न खाते में)। लेकिन कहीं एक महत्वपूर्ण अंतर होना चाहिए जो आपके प्रश्न में कोड स्निपेट में दिखाई नहीं दे रहा है और जिससे आपका मॉडल काम करने में विफल रहता है।

संपादित

मैं एमएस एसक्यूएल प्रदाता (एसक्यूएल सर्वर 2008 R2 एक्सप्रेस डीबी), नहीं MySQL कनेक्टर के साथ ऊपर कंसोल आवेदन काम कर परीक्षण किया है। जाहिर है यह "महत्वपूर्ण अंतर" था।

+0

स्टैक ट्रेस की एक और गहन समीक्षा से यह प्रतीत होता है कि यह MySQL कनेक्टर सॉफ़्टवेयर है जो अपवाद फेंक रहा है। दूसरे शब्दों में, MySQL कनेक्टर सक्रिय रूप से सक्रिय होने की इजाजत नहीं देता है, ईएफ 4.1 नहीं। –

+0

@ केसी: अच्छा है कि आपको समस्या का स्रोत मिला! यह मैंने देखा है कि ईएफ MySQL कनेक्टर की पहली सीमा नहीं है। – Slauma

+0

हां, मैंने MySQL के साथ कई सीमाएं और बग में भाग लिया है। काश मैं समय पर वापस जा सकता हूं और इस परियोजना को एमएसएसक्यूएल के साथ शुरू कर सकता हूं। –

3

हो सकता है कि एक छोटे से पार्टी के लिए देर से, लेकिन मैं निम्नलिखित तरीके को काफी एक वर्तमान प्रोजेक्ट में उपयोगी पाया:

IQueryable<FileDefinition> query = db.FileDefinitions 
    .Include(x => x.FieldDefinitions.Select(y => y.DefinitionChangeLogs.Select(z => z.FieldDefinition.FieldValidationTables))) 

कहाँ बल्कि एक दूसरी पंक्ति के शामिल का उपयोग करने से, का चयन का उपयोग मूल नेविगेशन करने के लिए वापस पाने के लिए संपत्ति और दूसरा उस संपत्ति के लिए आगे बढ़ने का चयन करें जिसमें आपको शामिल करने की आवश्यकता है।

+0

काम के आसपास के लिए धन्यवाद। मैं अब उस परियोजना में शामिल नहीं हूं, लेकिन उम्मीद है कि यह दूसरों की मदद करेगा। मैं देर से ओआरएम से परहेज कर रहा हूं। –