मैंने पहले एंटिटी फ्रेमवर्क या जेनेरिक के साथ काम नहीं किया है और मुझे अपना कोड कम करने में कुछ कठिनाई है।क्या एक इकाई ढांचे 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>();
}
अपनी GetItems विधि – jure
पर "कहां टी: कक्षा" बाधा जोड़ने की कोशिश करें जो जोड़ने के लिए मदद नहीं करता है .एड कार्यक्षमता। GetItems वर्तमान में काम करता है, लेकिन मैं संदर्भ का उपयोग करने में सक्षम नहीं हूं जैसे 'context.Set ()। (आइटम) जोड़ें; ' –
Warheft
आपको दोनों विधियों पर एक ही बाधा की आवश्यकता है। यदि में GetItems विधि की तुलना में "कक्षा" बाधा है जो जोड़ता है, तो "वर्ग" बाधा भी होनी चाहिए। –
jure