2009-03-20 10 views
6

में अपडेट करने का सबसे अच्छा तरीका मेरे पास कई इकाई वर्ग हैं जिन्हें मैं निश्चित चौड़ाई टेक्स्ट फ़ाइलों को पार्स करने के साथ-साथ लिंक से SQL का उपयोग करने के लिए उपयोग करता हूं। मैं इन वर्गों का उपयोग टेक्स्ट फ़ाइलों से डेटा पार्स करने के लिए करता हूं, और डेटाबेस में डेटा की तुलना करता हूं।लिंक से SQL

इन इकाइयों में से एक में बहुत सारी संपत्तियां हैं, और मैं लिंक परिणाम ऑब्जेक्ट पर प्रत्येक व्यक्तिगत संपत्ति को सेट करने में समय बर्बाद नहीं करना चाहता हूं।

क्या लिंक कहने का कोई तरीका है "यहां मेरा ऑब्जेक्ट है, रिकॉर्ड अपडेट करने के लिए इसका उपयोग करें"? यहाँ है कोड मैं पर काम कर रहा हूँ:

 
if (partialContent.MonthlyAddChange == "A") 
    { 
     bookContentTable.InsertOnSubmit(partialContent); 
    } 
    else if (partialContent.MonthlyAddChange == "C") 
    { 
     var query = from bookContent in bookContentTable 
        where bookContent.EAN == partialContent.EAN 
        select bookContent; 

     if (query != null) 
     { 
      // Do something with query.First() 
     } 
    } 
} 

यह रिकॉर्ड को हटाने और इस मामले में एक InsertOnSubmit() करना बेहतर है?

+3

"क्वेरी" चर कभी शून्य नहीं है, अनुक्रम खाली हो सकता है, लेकिन शून्य नहीं। –

उत्तर

2

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

0

मैं हटा/पुनः नहीं हटाऊंगा। यह मानते हुए कि दो ऑब्जेक्ट्स में उन गुणों के संबंध में एक ही इंटरफ़ेस है जो आप अपडेट करना चाहते हैं, मैं प्रतिबिंब का उपयोग करूंगा और परिवर्तन के मानों को मौजूदा ऑब्जेक्ट में कॉपी करूंगा। यदि मूल में से कोई भी मूल्य अलग है, तो रिकॉर्ड अपडेट होने की आवश्यकता के रूप में चिह्नित किया जाएगा और सबमिट चेंज इसका ख्याल रखेगा।

उदाहरण के लिए (थोड़ा त्रुटि जाँच के साथ):

foreach (var bookInfo in bookContent.GetType().GetProperties()) 
{ 
    var partialInfo = partialContent.GetType().GetProperty(bookInfo.Name); 
    if (partialInfo != null) 
    { 
     bookInfo.SetValue(partialInfo.GetValue(partialContent, null)); 
    } 
} 

यदि आप पता था कि वे एक ही प्रकार आप के बजाय partialContent के लिए एक नया एक हो रही के पहले PropertyInfo पुन: उपयोग सकते थे।

1

मुझे लगता है कि आप DataContext.Table.Attach (रिकॉर्ड, सत्य) और फिर DataContext.SubmitChanges() जैसे कुछ का उपयोग कर सकते हैं। लेकिन मेरे पास यह पूरी तरह से बाहर नहीं है ...

तो अब मैंने एक परीक्षण किया है। यह केवल तभी काम करेगा यदि आपको समवर्ती जांच की आवश्यकता नहीं है (यानी आप केवल तालिका अपडेट कर रहे हैं)।

यहाँ मेरी मेज

People 
PersonID int 
FirstName varchar(50) 
LastName varchar(50) 

मैं निम्नलिखित रिकॉर्ड

> PersonID  FirstName LastName 
> 1   Jason  Punyon 

मैं सिर्फ इस तालिका कहा जाता PeopleDataContext के साथ एक LINQ2SQL DataContext बनाया के साथ और लोगों को कक्षा मैं सेट के हर संपत्ति पर तालिका आबादी है प्रत्येक रिकॉर्ड संपत्ति की अद्यतन चेक संपत्ति कभी नहीं।

कोड यह रहा:

static void Main(string[] args) 
{ 
    var p = new People(); 
    p.PersonID = 1; 
    p.FirstName = "Jason"; 
    p.LastName = "This is a new last name"; 


    using (var db = new PeopleDataContext()) 
    { 
     db.Peoples.Attach(p, true); 
     db.SubmitChanges(); 
    } 
} 

और इसे सफलतापूर्वक काम करता है। कोई प्रतिबिंब या कुछ भी नहीं, लेकिन जैसा कि मैंने कहा, आप concurrency जांच खो देते हैं।

+0

क्या आप बड़े अक्षरों में अद्यतन चेक संपत्ति परिवर्तन कर सकते हैं, क्योंकि मूल रूप से उत्तर है यदि आपको समवर्तीता के बारे में चिंता करने की आवश्यकता नहीं है –

1

क्या इस मामले में रिकॉर्ड को हटाना और InsertOnSubmit() करना बेहतर है?

नहीं, निश्चित रूप से नहीं - केवल रेफरेंसियल अखंडता पर विचार करें कि किसी भी अच्छे, स्थिर डीबी डिजाइन का उपयोग करना चाहिए। यदि आपका रिकॉर्ड पहले से ही अन्य पंक्तियों द्वारा उपयोग किया जा रहा है, तो आप इसे आसानी से हटा नहीं सकते हैं और इसे फिर से सम्मिलित नहीं कर सकते हैं - आप उन अखंडता बाधाओं को तोड़ देंगे।

यदि आप कुछ मान बदल रहे हैं, तो मौजूदा पंक्ति को अपडेट करें - बहुत आसान और अधिक संगत।

मार्क

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