2013-06-05 6 views
7

मैंने पहले एंटिटी फ्रेमवर्क या जेनेरिक के साथ काम नहीं किया है और मुझे अपना कोड कम करने में कुछ कठिनाई है।क्या एक इकाई ढांचे dbset में आइटम जोड़ने के लिए एक सामान्य विधि बनाना संभव है?

मैं डेटा के साथ 10 लुकअप टेबल लोड करने के लिए एक टेक्स्ट फ़ाइल पार्स कर रहा हूं जो संभवतः रात में बदल सकता है। पाठ फ़ाइलों के पास "प्रकार" के लिए शीर्षक होता है जिसके बाद कुंजी/मान सेट की सूची होती है। मेरे पास यह पूरी तरह से काम कर रहा है, लेकिन मैं इसे साफ़ करने के लिए कोड को दोबारा प्रतिक्रिया देना चाहता हूं और इसे पूरा करने के लिए जेनेरिक तरीकों का उपयोग करना चाहता हूं ताकि मैं डुप्लिकेट कोड को कम कर सकूं।

मुझे एक सामान्य विधि पर पार्सिंग मिल गया है, लेकिन मैं यह समझने में सक्षम नहीं हूं कि संदर्भ में संदर्भों को सामान्य रूप से कैसे जोड़ा जाए। मैं प्रत्येक प्रकार के लिए संस्थाओं की एक सूची पर पाश करने के लिए है और उन्हें संदर्भ में जोड़ने के लिए:

void Main() 
{ 
    switch (line.ToUpper()) 
    { 
     case "AREA": 
     { 
      List<Area> areaList = this.GetItems<Area>(file); 

      foreach (var element in areaList) 
      { 
       if (context.Area.Find(element.Id) == null) 
       { 
        context.Area.Add(element); 
       } 
      } 

      break; 
     } 
     case "CATEGORY": 
     { 
      List<Category> categoryList = this.GetItems<Category>(file); 

      foreach (var element in categoryList) 
      { 
       if (context.Category.Find(element.Id) == null) 
       { 
        context.Category.Add(element); 
       } 
      } 

      break; 
     } 
    } 
} 

private List<T> GetItems<T>(StreamReader reader) where T : ILookupData, new() 
{ 
    string line; 
    List<T> list = new List<T>();    

    while (reader.Peek() == ' ') 
    { 
     line = reader.ReadLine().TrimStart(); 
     string[] tokens = line.Split(new string[] { " - " }, 2, StringSplitOptions.None); 

     T item = new T(); 
     item.Id = Convert.ToInt32(tokens[0]); 
     item.Description = (string)tokens[1]; 

     list.Add(item); 
    } 

    return list; 
} 

अद्यतन: उपरोक्त ठीक काम करता है, लेकिन संदर्भ जोड़ा पाने के लिए नहीं कर पा रहे।

मैं कुछ अलग अलग बातें की कोशिश की है, लेकिन जब मैं ऊपर सामान्य संदर्भ के लिए कोशिश यह त्रुटि मिलती रहती लगते हैं:

प्रकार 'टी' आदेश के रूप में उपयोग करने के लिए एक संदर्भ प्रकार होना चाहिए जेनेरिक प्रकार की विधि में पैरामीटर 'टी'।

आखिरी बात मैंने कोशिश की संदर्भ के लिए एक क्रियाशील GetDbSet जोड़ने के लिए किया गया था:

public DbSet<T> GetDbSet<T>() where T : class 
{ 
    return this.Set<T>(); 
} 

लेकिन मैं GetItems विधि के लिए इस कोड को जोड़ने मेरी नियंत्रक में एक ही त्रुटि मिलती है:

using (MyContext context = new MyContext()) 
{ 
    var dbSet = context.GetDbSet<T>(); 
} 
+0

अपनी GetItems विधि – jure

+0

पर "कहां टी: कक्षा" बाधा जोड़ने की कोशिश करें जो जोड़ने के लिए मदद नहीं करता है .एड कार्यक्षमता। GetItems वर्तमान में काम करता है, लेकिन मैं संदर्भ का उपयोग करने में सक्षम नहीं हूं जैसे 'context.Set ()। (आइटम) जोड़ें; ' – Warheft

+0

आपको दोनों विधियों पर एक ही बाधा की आवश्यकता है। यदि में GetItems विधि की तुलना में "कक्षा" बाधा है जो जोड़ता है, तो "वर्ग" बाधा भी होनी चाहिए। – jure

उत्तर

17

मेरे पास मेरे वर्तमान प्रोजेक्ट में एक सामान्य भंडार है।

public void Add<T>(T newItem) where T : class 
{ 
    db.Set<T>().Add(newItem); 
} 

जहां dbDbContext वस्तु ही है: यह अपने ऐड तरीका है। where T : class संदर्भ प्रकारों के बारे में त्रुटि को हल करता है। इसके बिना, आप को 0 के रूप में टाइप कर सकते हैं, जिसमें bool या struct, या कोई मान प्रकार, DbSet.Add() संभाल नहीं सकता है। where निर्दिष्ट करता है कि टी एक वर्ग होना चाहिए, जो एक संदर्भ प्रकार है, और इसलिए अनुमति है।

+0

अच्छा और साफ उत्तर –

+0

यह भंडार के लिए काम करता है, लेकिन अगर मैं इसे GetItems में कॉल करने का प्रयास करता हूं तो मुझे अभी भी त्रुटि मिल रही है: 'context.Set ()। (आइटम);' या 'context.Add जोड़ें (आइटम); ' – Warheft

+0

इसे समझ लिया।यह एक ठोस प्रकार के बजाय एक इंटरफ़ेस का उपयोग करने के साथ एक विरासत मुद्दा था। अब, मुझे बस अपने मॉडल को थोड़ा सा संशोधित करने की आवश्यकता है। धन्यवाद। – Warheft

संबंधित मुद्दे