2015-09-25 7 views
5

मेरे एएसपी.नेट एमवीसी 4/ईएफ 5 वेब एप्लिकेशन के डेटाबेस में मेरे पास एक टिप्पणी कॉलम वाला एक टेबल है जिसे मैं नई टिप्पणियों को जोड़ना चाहता हूं। पारंपरिक T-SQL में, मैं लिखना चाहते हैं: स्ट्रिंग कॉन्सट के साथ अद्यतन एसक्यूएल बनाने के लिए ईएफ का कारण कैसे बनें?

UPDATE MyTable SET Comments = 'Hi' + CHAR(13)+CHAR(10) + Comments WHERE ID = 2 

मैं एफई (UOW + भंडार पैटर्न - जो मुझे खेद है) के लिए विधि LINQ के साथ मिल जाए, मैं पहली बार टिप्पणी नहीं और आगे जोड़ते के वर्तमान मूल्य क्वेरी करने के लिए है मेरी नई टिप्पणियां:

StringBuilder displayComment = new StringBuilder(); 
var item = uow.MyRepos.Where(i => i.ID == 2); 
item.Comments = displayComment.Append("Hi") 
           .Append(Environment.NewLine) 
           .Append(item.Comments) 
           .ToString(); 
uow.Save(); 

क्या डीबी से पूछताछ किए बिना इस अद्यतन को लिखने का कोई तरीका है? मैं उपरोक्त टी-एसक्यूएल उत्पन्न करने के लिए किसी भी तरह ईएफ प्राप्त करना चाहता हूं। टिप्पणियां लंबी हो सकती हैं और मुझे इसकी परवाह नहीं है कि इसमें क्या शामिल है। प्रदर्शन एक चिंता है।

अग्रिम धन्यवाद।

+1

मैं एक टिप्पणी के रूप में यहाँ इस जोड़ने के लिए, क्योंकि यह एक जवाब नहीं है: आप सही एफई क्या कर सकते हैं के बारे में कर रहे हैं, और कैसे करने के लिए कर दो। हालांकि, अगर आपको कुछ ऐसा करने की ज़रूरत है जो ईएफ समर्थन नहीं करता है, तो आपको इसे करने की कोशिश करने पर ऊर्जा खर्च करने की आवश्यकता नहीं है। आप अपनी समस्या को हल करने के लिए बस एक कस्टम क्वेरी या संग्रहीत प्रक्रिया निष्पादित कर सकते हैं। यह कम स्मार्ट लग सकता है, लेकिन मुझे नहीं लगता कि यह है। ऐसी कई चीजें हैं जो ईएफ नहीं कर सकती हैं, लेकिन * आपकी समस्या के लिए जादू या हैकी समाधान को लागू करने की कोशिश करने के बजाय * आपको अन्य तरीकों से काम करने की अनुमति है। एक ही समस्या बड़े पैमाने पर अद्यतन या हटावट के साथ उत्पन्न होती है। समाधान सरल है – JotaBe

+0

यह @JotaBe कहने के लिए धन्यवाद - मैं लाइनों के भीतर रहने की कोशिश कर रहा था, लेकिन कभी-कभी यह सबसे अच्छा समाधान नहीं है। – LoJo

+0

@LoJo आपने कहा *** मैं किसी भी तरह से ऊपर टी-एसक्यूएल उत्पन्न करने के लिए ईएफ प्राप्त करना चाहता हूं *** - यही कारण है कि आपका प्रश्न *** 5 *** तक बढ़ा दिया गया है (उस समय मैंने इसे लिखा था)। अन्यथा यह सिर्फ एक सामान्य आवश्यकता है, कुछ विशेष नहीं है और यहां तक ​​कि एक उत्तर भी जोड़ने की आवश्यकता नहीं है। आपको इसके बारे में कुछ टिप्पणी के साथ समझना चाहिए था और तुरंत प्रश्न हटा दिया था। – Hopeless

उत्तर

0

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

public int PrependComment(int id, String comment) 
{ 
    String sql = "UPDATE MyTable SET Comments = {0} + 
     CHAR(13)+CHAR(10) + Comments WHERE ID = {1}"; 
    return dbContext.Database.ExecuteSqlCommand(sql, comment, id); 
} 
+0

इसके लिए धन्यवाद।मैं चीजों को सीधे तरीके से करने की दृष्टि खो गया। – LoJo

0

मुझे लगता है कि आप केवल एक ही चीज के साथ खेल सकते हैं DbCommandInterceptor का उपयोग कर रहा है। आप प्रत्येक गैर-क्वेरी-निष्पादित आदेश (अद्यतन, हटाएं, डालें) को अवरुद्ध कर सकते हैं और इसे वास्तव में निष्पादित किए जाने से पहले कमांड टेक्स्ट को संशोधित कर सकते हैं। यहां कोड यह समझने के लिए है कि यह कैसे किया जा सकता है। आप और अधिक सुविधाजनक उपयोग के लिए यह refactor कर सकते हैं:

public class PrependTextInterceptor : DbCommandInterceptor 
{   
    const string table = "MyTable"; 
    const string column = "Comments"; 
    public override void NonQueryExecuting(DbCommand command, System.Data.Entity.Infrastructure.Interception.DbCommandInterceptionContext<int> interceptionContext) 
    { 
     command.CommandText = Regex.Replace(command.CommandText, 
           string.Format(@"(?i:(?<=^UPDATE \[.+\]\.\[{0}\]\r\nSET .* \[{1}\] =).+?(?=(,|\r\n)))", table, column), "$& + " + column);    
     base.NonQueryExecuting(command, interceptionContext);    
    } 
} 

//Usage 
DbInterception.Add(new PrependTextInterceptor()); 
//after this every time you set the Comments property 
//it will be understood as prepending  
item.Comments = displayComment.Append("Hi") 
           .Append(Environment.NewLine).ToString(); 

बस एक और ध्यान दें, आप लोड यदि आपका item सामान्य रूप से, अपने Comments संपत्ति भी लोड किया जाना चाहिए। तो आप प्रीपेडिंग से पहले इसे लोड नहीं करने का लाभ खो देते हैं। मैं तुम्हें Attach उपयोग करने के लिए है जिसमें आप सिर्फ जानना चाहता ID यह लोड किए बिना इसे अद्यतन करने में सक्षम होना चाहिए की जरूरत है (एक प्रश्न context.Set<MyTable>().Single(e => e.ID == 2) के माध्यम से के रूप में की तरह, Comments तो होना चाहिए निश्चित रूप से भरी हुई)।

+0

इसे पोस्ट करने के लिए धन्यवाद। मैंने @ जोटाबी और कॉलिन की सिफारिश के संयोजन के साथ जाने का फैसला किया है, लेकिन मुझे लगता है कि दूसरों को यह बहुत उपयोगी लगेगा। – LoJo

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