2008-09-17 24 views
21

मुझे LINQ से SQL को डीबग करने और परिवर्तन सबमिट करने का प्रयास करने में वास्तव में कठिन समय हो रहा है।LINQ से SQL सबमिट करने के लिए डिबगिंग सबमिट करें()

मैं http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx का उपयोग कर रहा हूं, जो सरल प्रश्नों को डीबग करने के लिए बहुत अच्छा काम करता है।

मैं अपने आवेदन से निम्नलिखित स्निपेट के साथ अपने प्रोजेक्ट के लिए DataContext कक्षा में काम कर रहा हूँ:

JobMaster newJobToCreate = new JobMaster(); 
newJobToCreate.JobID = 9999 
newJobToCreate.ProjectID = "New Project"; 
this.UpdateJobMaster(newJobToCreate); 
this.SubmitChanges(); 

जब मैं this.SubmitChanges चलाने मैं कुछ बहुत ही अजीब अपवाद पकड़ेगा;

Index was outside the bounds of the array. 

स्टैक ट्रेस स्थानों मैं में कदम नहीं कर सकते है:

at System.Data.Linq.IdentityManager.StandardIdentityManager.MultiKeyManager`3.TryCreateKeyFromValues(Object[] values, MultiKey`2& k) 
    at System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache`2.Find(Object[] keyValues) 
    at System.Data.Linq.IdentityManager.StandardIdentityManager.Find(MetaType type, Object[] keyValues) 
    at System.Data.Linq.CommonDataServices.GetCachedObject(MetaType type, Object[] keyValues) 
    at System.Data.Linq.ChangeProcessor.GetOtherItem(MetaAssociation assoc, Object instance) 
    at System.Data.Linq.ChangeProcessor.BuildEdgeMaps() 
    at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) 
    at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 
    at System.Data.Linq.DataContext.SubmitChanges() 
    at JobTrakDataContext.CreateNewJob(NewJob job, String userName) in D:\JobTrakDataContext.cs:line 1119 

किसी को भी किसी भी उपकरण या तकनीक वे का उपयोग है? क्या मुझे कुछ आसान याद आ रही है?

संपादित: मैं Slace के सुझाव का उपयोग करके सेटअप .net डिबगिंग है, फिर भी .net 3.5 कोड अभी तक उपलब्ध नहीं है: http://referencesource.microsoft.com/netframework.aspx

EDIT2: मैं प्रति sirrocco के रूप में InsertOnSubmit को बदल दिया है सुझाव, अभी भी एक ही त्रुटि हो रही है।

EDIT3: मैं उत्पन्न एसक्यूएल लॉग इन करने और ChangeExceptoinException पकड़ने की कोशिश कर सैम सुझाव क्रियान्वित किया है। ये सुझाव किसी और प्रकाश को नहीं छोड़ते हैं, जब भी मेरा अपवाद फेंक दिया जाता है तो मैं वास्तव में एसक्यूएल उत्पन्न नहीं कर रहा हूं।

EDIT4: मुझे एक उत्तर मिला जो नीचे मेरे लिए काम करता है। यह सिर्फ एक सिद्धांत है लेकिन इसने मेरे वर्तमान मुद्दे को ठीक कर दिया है। बिल्कुल फ़िल्टर्ड अन्य अनुप्रयोगों को हल करने आदि डाटाबेस को ऐक्सेस -

+0

यह त्रुटि कई क्लाइंट्स के साथ हुई, केवल विंडोज एक्सपी के साथ मशीनों पर, मुझे यह हॉट-फ़िक्स मिला जो समस्या हल करता है। [I386] (http://hotfixv4.microsoft.com/.NET%20Framework%203.5%20-%20Windows%20Server%202003,%20WindowsXP,%20Windows%20Vista,%20Windows%20Server%202008%20 (MSI)/sp1/DevDiv975687/30729.5821/मुफ्त/448814_intl_i386_zip.exe) और [x64] (http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=963657&kbln=en-us) – gpiccin

उत्तर

8

सबसे पहले, मदद के लिए सभी को धन्यवाद, मुझे अंत में यह मिला।

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

मैं चीजों की एक जोड़ी देखा, जबकि मैं यह कर रहा था:

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

यह केवल एक सिद्धांत है। अगर कोई इसे बेहतर समझा सकता है तो मुझे यहां ठोस जवाब देना अच्छा लगेगा।

+2

में आउटपुट प्राप्त करने के लिए किसी ने एक इकाई से दूसरे में एक एसोसिएशन बनाया था जहां विदेशी अंत प्राथमिक कुंजी नहीं था। यह 3.5 एसपी 1 में एक बग है। – DamienG

1

एक सरल समाधान अपने डेटाबेस पर एक निशान चलाने के लिए और इसके खिलाफ चलाने के प्रश्नों का निरीक्षण करने के हो सकता है।

एक बार आप अतीत अपवाद मिल बिल्कुल ही मदद करता है यही कारण है कि ...

0

मानव संसाधन विकास मंत्री।

एक डब्ल्यूएजी (जंगली गधा अनुमान) लेना, यह मुझे LINQ की तरह दिखता है - एसक्यूएल एक ऐसी वस्तु के साथ ऑब्जेक्ट ढूंढने की कोशिश कर रहा है जो मौजूद नहीं है, जो कि जॉबमास्टर क्लास के निर्माण पर आधारित है। क्या उस तालिका से संबंधित विदेशी कुंजी हैं जैसे LINQ से SQL एक वर्ग का उदाहरण लाने का प्रयास करेगा, जो अस्तित्व में नहीं हो सकता है? प्रतीत होता है कि आप किसी ऑब्जेक्ट की प्रोजेक्ट आईडी को स्ट्रिंग पर सेट कर रहे हैं - क्या आपके पास वास्तव में एक आईडी है जो स्ट्रिंग है? आप एक नई परियोजना के लिए सेट की कोशिश कर रहे हैं, तो आप एक नई परियोजना बना सकते हैं और अपने आईडी प्राप्त करने के लिए की आवश्यकता होगी।

आखिरकार, अपडेटजोबस्टर क्या करता है? क्या ऐसा कुछ ऐसा कर सकता है जैसे उपर्युक्त लागू होगा?

1

2008 वी.एस. हालांकि डिबग करने की क्षमता है।नेट ढांचे (http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx)

यह वह जगह है शायद आपका सर्वश्रेष्ठ दांव, आप देख सकते हैं क्या हो रहा है और क्या सभी गुण समय में सही बिंदु पर कर रहे हैं

+0

आज के रूप में http: // संदर्भ .NETrosoft.com/netframework.aspx .net 3.5 के लिए स्रोत कोड अभी तक उपलब्ध नहीं है। – ben

2

त्रुटि आप ऊपर की बात कर रहे हैं आमतौर पर के कारण होता है गलत दिशा में इंगित करने वाले संगठन। डेटा मॉडलिंग टूल की तुलना में एल 2 एस डिजाइनर बिंदु में एसोसिएशन तीर के बाद मैन्युअल रूप से डिजाइनर को एसोसिएशन जोड़ते समय यह बहुत आसानी से होता है।

यह अच्छा होगा अगर उन्होंने एक और वर्णनात्मक अपवाद फेंक दिया, और शायद वे भविष्य के संस्करण में होंगे। (डेमियन/मैट ...?)

1

आप एक नए उदाहरण पर UpdateJobMaster क्यों करते हैं? यह InsertOn सबमिट नहीं होना चाहिए?

JobMaster newJobToCreate = new JobMaster(); 
newJobToCreate.JobID = 9999 
newJobToCreate.ProjectID = "New Project"; 
this.InsertOnSubmit(newJobToCreate); 
this.SubmitChanges(); 
+0

मैं InsertOnSubmit में बदल गया हूं, फिर भी वही त्रुटि प्राप्त हो रही है – ben

4

आप अपने DataContext के लिए एक आंशिक वर्ग बना सकते हैं और बनाया गया है या क्या आप सेटअप करने के लिए आंशिक विधि console.out एक #if डीबग में लिपटे करने के लिए लॉग .. यह देखने के लिए आप में मदद मिलेगी है उपयोग कर सकते हैं आपके द्वारा उपयोग किए जा रहे डेटाकॉन्टेक्स्ट के किसी भी उदाहरण को डीबग करते समय निष्पादित प्रश्न।

मैं एसक्यूएल अपवाद को यह उपयोगी है, जबकि डिबगिंग LINQ पाया है ..

partial void OnCreated() 
{ 
#if DEBUG 
     this.Log = Console.Out; 
#endif 
} 
6

मेरी पहली डिबगिंग कार्रवाई उत्पन्न एसक्यूएल को देखने के लिए होगा:

JobMaster newJobToCreate = new JobMaster(); 
newJobToCreate.JobID = 9999 
newJobToCreate.ProjectID = "New Project"; 
this.UpdateJobMaster(newJobToCreate); 
this.Log = Console.Out; // prints the SQL to the debug console 
this.SubmitChanges(); 

दूसरा कब्जा करने के लिए किया जाएगा ChangeConflictException और विफलता के विवरण पर एक नज़र डालें।

catch (ChangeConflictException e) 
    { 
    Console.WriteLine("Optimistic concurrency error."); 
    Console.WriteLine(e.Message); 
    Console.ReadLine(); 
    foreach (ObjectChangeConflict occ in db.ChangeConflicts) 
    { 
     MetaTable metatable = db.Mapping.GetTable(occ.Object.GetType()); 
     Customer entityInConflict = (Customer)occ.Object; 
     Console.WriteLine("Table name: {0}", metatable.TableName); 
     Console.Write("Customer ID: "); 
     Console.WriteLine(entityInConflict.CustomerID); 
     foreach (MemberChangeConflict mcc in occ.MemberConflicts) 
     { 
     object currVal = mcc.CurrentValue; 
     object origVal = mcc.OriginalValue; 
     object databaseVal = mcc.DatabaseValue; 
     MemberInfo mi = mcc.Member; 
     Console.WriteLine("Member: {0}", mi.Name); 
     Console.WriteLine("current value: {0}", currVal); 
     Console.WriteLine("original value: {0}", origVal); 
     Console.WriteLine("database value: {0}", databaseVal); 
     } 
    } 
    } 
+0

मेरा ऐप वास्तव में कभी भी एसक्यूएल उत्पन्न नहीं कर रहा है और यह किसी भी चेंज कॉन्फ्लिक्ट एक्सेप्शन उत्पन्न नहीं कर रहा है, यह इस चरण से पहले बमबारी कर रहा है। – ben

+3

अच्छा है। ASP.Net का उपयोग करने वाले लोगों के लिए, बस कंसोल को प्रतिस्थापित करें। डीबग के माध्यम से। आउटपुट विंडो – citronas

0

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

कि, अन्य सीमाओं के साथ-साथ हमें डिजाइनर को छोड़ने और कक्षाओं को हाथ से डिजाइन करने का कारण बन गया। पैटर्न के लिए उपयोग करने के बाद, यह डिजाइनर का उपयोग करने से वास्तव में आसान है।

0

मैंने आज यहां एक समान प्रश्न पोस्ट किया: Strange LINQ Exception (Index out of bounds)

यह एक अलग उपयोग केस है - जहां यह बग सबमिटChanges() के दौरान होता है, मेरा एक साधारण क्वेरी के दौरान होता है, लेकिन यह रेंज त्रुटि से बाहर एक सूचकांक भी है।

मामले में इस सवाल में क्रॉस पोस्टिंग सवाल में डेटा का संयोजन एक अच्छा सामरी जवाब में मदद करता है या तो :)

0

चेक कि अपने dbml में सभी "प्राथमिक कुंजी" कॉलम वास्तव में पर प्राथमिक कुंजी से संबंधित डेटाबेस टेबल मुझे बस एक ऐसी स्थिति थी जहां डिजाइनर ने डीबीएमएल में एक अतिरिक्त पीके कॉलम डालने का फैसला किया, जिसका मतलब है कि LINQ से SQL को सहेजते समय विदेशी कुंजी के दोनों तरफ नहीं मिल सका।

0

मैं हाल ही में एक ही मुद्दा का सामना करना पड़ा:

Proce proces = context.Proces.Single(u => u.ProcesTypeId == (from pt in context.ProcesTypes 
                    where pt.Name == "Fix-O" 
                    select pt).Single().ProcesTypeId && 
                    u.UnitId == UnitId); 

कहाँ संदर्भ स्पष्ट रूप से DataContext वस्तु और "इकाई" यूनिट वस्तु का एक उदाहरण है, एक था: मैं

Proce proces = unit.Proces.Single(u => u.ProcesTypeId == (from pt in context.ProcesTypes 
                     where pt.Name == "Fix-O" 
                     select pt).Single().ProcesTypeId && 
                     u.UnitId == UnitId); 

के बजाय था क्या किया एक डीबीएमएल फ़ाइल से डेटा क्लास।

अगला, मैंने किसी अन्य डेटा क्लास ऑब्जेक्ट के उदाहरण में एक संपत्ति सेट करने के लिए "proce" ऑब्जेक्ट का उपयोग किया। शायद LINQ इंजन यह जांच नहीं कर सका कि मैं "प्रोसेस" ऑब्जेक्ट से जिस संपत्ति को स्थापित कर रहा था, उसे INSERT कमांड में अनुमति दी गई थी जिसे LINQ द्वारा अन्य डेटा क्लास ऑब्जेक्ट को डेटाबेस में जोड़ने के लिए बनाया जाना था।

30

मुझे हमेशा यह जानने के लिए उपयोगी लगता है कि सबमिटChanges() विधि में DataContext में कौन से परिवर्तन भेजे जा रहे हैं।

मैं DataContext.GetChangeSet() विधि का उपयोग करें, यह एक ChangeSet वस्तु दृष्टान्त है कि 3 रीड-ओनली IList की वस्तुओं जो या तो, जोड़ दिया गया है संशोधित, या हटाया का रखती है देता है।

तुम बस SubmitChanges विधि कॉल करने से पहले एक ब्रेकपाइंट जगह कर सकते हैं, और एक घड़ी (या त्वरित घड़ी) जोड़ने युक्त

ctx.GetChangeSet(); 

कहाँ ctx अपने DataContext की वर्तमान उदाहरण है, और फिर आप हो जाएगा सबमिट चेंज कॉल पर प्रभावी होने वाले सभी परिवर्तनों को ट्रैक करने में सक्षम।

0

मेरे पास एक ही गैर बोलने वाली त्रुटि थी।

मेरे पास एक तालिका के कॉलम के लिए एक विदेशी कुंजी संबंध था जो तालिका की प्राथमिक कुंजी नहीं थी, बल्कि एक अद्वितीय स्तंभ था। जब मैंने तालिका के प्राथमिक कुंजी होने के लिए अद्वितीय कॉलम बदल दिया तो समस्या दूर हो गई।

उम्मीद है कि यह किसी की भी मदद करेगा!

1

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

यदि आपको यह त्रुटि मिल रही है और आपने अपने पीओसीओ पर ऑनक्रेटेड या ऑनलोडेड विधियों को पेश किया है, तो उन तरीकों से कदम उठाने का प्रयास करें।

2

यह है कि मैं क्या

... 
var builder = new StringBuilder(); 
try 
{ 
    context.Log = new StringWriter(builder); 
    context.MY_TABLE.InsertAllOnSubmit(someData); 
    context.SubmitChanges();     
} 
finally 
{ 
    Log.InfoFormat("Some meaningful message here... ={0}", builder); 
} 
0

मैं इस सवाल पर समाप्त हो गया जब मेरे LINQ ChangeConflictException डिबग करने के लिए कोशिश कर किया है। अंत में मुझे एहसास हुआ कि समस्या यह है कि मैं मैन्युअल रूप से मेरी dbml फ़ाइल में एक मेज पर एक संपत्ति जोड़ा था, लेकिन मैं Nullable (मेरे मामले में सच होना चाहिए) और सर्वर डाटा जैसे गुणों को सेट करना भूल प्रकार

उम्मीद है कि यह किसी की मदद करेगा।

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