2008-10-26 21 views
5

मैं एक बाल तालिका में रिकॉर्ड डालने के लिए LINQ का उपयोग करने का प्रयास कर रहा हूं और मैं प्राप्त कर रहा हूं "निर्दिष्ट कास्ट वैध नहीं है" त्रुटि प्राप्त करने में कुछ है जिसमें w/ शामिल कुंजी शामिल हैं। स्टैक ट्रेस है:LINQ से SQL -

संदेश: निर्दिष्ट कास्ट मान्य नहीं है।

प्रकार: System.InvalidCastException स्रोत: System.Data.Linq TargetSite: बूलियन TryCreateKeyFromValues ​​(System.Object [], वी ByRef) HELPLINK: अशक्त ढेर: System.Data.Linq.IdentityManager.StandardIdentityManager पर .SingleKeyManager 2.TryCreateKeyFromValues(Object[] values, V& v) at System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache 2.Find (ऑब्जेक्ट [] keyValues) (keyValues ​​MetaType प्रकार, वस्तु []) System.Data.Linq.IdentityManager.StandardIdentityManager.Find पर System.Data.Linq.CommonDataServices.GetCachedObject पर (MetaType टाइप करें, ऑब्जेक्ट [] कीवैल्यूज़) सिस्टम.डाटा.लिंक। चेंजप्रोसेसर। गेटऑथरइटम (मेटाएसो ciation Assoc, उदाहरण वस्तु) System.Data.Linq.DataContext.SubmitChanges पर System.Data.Linq.ChangeProcessor.BuildEdgeMaps() System.Data.Linq.ChangeProcessor.SubmitChanges पर (ConflictMode failureMode) पर (ConflictMode

: System.Data.Linq.DataContext.SubmitChanges()

(.....)

यह त्रुटि निम्न कोड पर फेंक दिया जा रहा है पर failureMode)

प्रश्नों की तालिका में दोनों के बीच एक एफके संबंध है।
अभिभावक तालिका के कॉलम को 'आईडी' कहा जाता है, पीके है, और प्रकार का है: INT NOT NULL IDENTITY
बच्चे तालिका के कॉलम को 'respondCodeTableId' कहा जाता है और यह प्रकार है: INT NOT NULL।

codebookVersion (मूल वर्ग) तालिका tblResponseCodeTable
प्रतिक्रिया कोड (childClass) तालिका tblResponseCode

का मानचित्रण अगर मैं सीधे एसक्यूएल निष्पादित करने के लिए नक्शे, यह काम करता है। जैसे

INSERT INTO tblResponseCode 
(responseCodeTableId, surveyQuestionName, code, description) 
VALUES (13683, 'Q11', 3, 'Yet another code') 

उसी कक्षा के अपडेट ठीक से काम करते हैं। जैसे

codebookVersion.ResponseCodes[0].Description = "BlahBlahBlah"; 
db.SubmitChanges(); //no exception - change is committed to db 

मैं चर, आर सी की जांच करने के बाद, .Add() ऑपरेशन के बाद और यह है, वास्तव में, उचित responseCodeTableId प्राप्त करते हैं, के बाद से मैं यह है कि संग्रह करने के लिए जोड़ रहा बस के रूप में मैं उम्मीद होती है।

tblResponseCodeTable's full definition: 
COLUMN_NAME TYPE_NAME 
id     int identity 
responseCodeTableId int 
surveyQuestionName nvarchar 
code    smallint 
description   nvarchar 
dtCreate   smalldatetime 

डीटीक्रेट के पास GetDate() का डिफ़ॉल्ट मान है।

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

मैंने एक गैर पीके क्षेत्र से संबंध होने पर समस्या को देखा और देखा है, लेकिन यह मेरे मामले में फिट नहीं है।

क्या कोई मेरे लिए इस स्थिति पर कोई प्रकाश डाल सकता है? मैं यहां क्या अविश्वसनीय रूप से स्पष्ट बात कर रहा हूं?

बहुत धन्यवाद।
पॉल Prewett

+0

इसी समस्या यहाँ पर चर्चा की है, मेरी समस्याओं को हल: http://stackoverflow.com/questions/4801364/specified-cast-is-not-valid-error-when-saving- linq-to-sql-entity –

उत्तर

0
ResponseCode rc = new ResponseCode() 
    { 
     SurveyQuestionName = "Q11", 
     Code = 3, 
     Description = "Yet another code" 
    }; 

और:

INSERT INTO tblResponseCode 
(responseCodeTableId, surveyQuestionName, code, description) 
VALUES (13683, 'Q11', 3, 'Yet another code') 

, एक ही नहीं कर रहे हैं आप विदेशी कुंजी संदर्भ में पारित नहीं कर रहे हैं। अब, मैं LINQ2SQL पर विशाल n00b हूं, लेकिन मैं डर दूंगा कि LINQ2SQL आपके लिए ऐसा करने के लिए पर्याप्त स्मार्ट नहीं है, और यह इसे अनाम शब्दकोश के पहले पैरामीटर के रूप में अपेक्षा करता है, और एक स्ट्रिंग को एक पूर्णांक में डालने का प्रयास कर रहा है ।

बस कुछ विचार।

+0

आरसी कोडबुक की एफके संपत्ति के माध्यम से जोड़ा जा रहा है -> codebookVersion.ResponseCodes.Add (आरसी); – chakrit

0

यह ब्लॉक:

codebookVersion.ResponseCodes.Add(rc); 
db.SubmitChanges(); //exception gets thrown here 

आप InsertOnSubmit बजाय Add कोशिश कर सकते हैं? अर्थात

codebookVersion.ResponseCodes.InsertOnSubmit(rc); 

मुझे लगता है कि Add यदि मेरी स्मृति मुझे सही में कार्य करता है रिकॉर्ड डालने के लिए इस्तेमाल किया जा करने के लिए नहीं है। InsertOnSubmit उपयोग करने वाला एक है।

0

अपराधियों को आजमाने और संकुचित करने के लिए।

आप की तरह कुछ के साथ अनाम शब्दकोश की जगह करने की कोशिश की है:

ResponseCode rc = new ResponseCode(); 

rc.SurveyQuestName = "Q11"; 
rc.Code = 3; 
rc.Description = "Yet Another Code"; 

मैं अभी तक वास्तव में .NET 3.5 अभी तक के साथ काम करने है (दिन काम अभी भी सभी 2.0 है), इसलिए मैं अगर सोच रहा हूँ वहाँ अज्ञात शब्दकोश का उपयोग कर डेटा पास करने के साथ एक मुद्दा है (मामले एक के लिए SQL कॉलम से मेल नहीं खाते हैं)।

1

मूल तालिका की स्कीमा पोस्ट करें।

यदि आप यहां देखते हैं, तो कुछ अन्य लोगों को आपकी समस्या है। http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3493504&SiteID=1

ऐसा प्रतीत होता है कि Linq2SQL को कुछ प्राथमिक कुंजी के लिए कुछ विदेशी कुंजी मैप करने में परेशानी है। एक लड़के के पास एक संकल्प था, लेकिन मुझे लगता है कि आप पहले से ही पहचान कॉलम पर मैप कर रहे हैं।

0

हाँ, मैंने इसे और अन्य पोस्ट पढ़ ली हैं, लेकिन ऐसा लगता है कि ऐसा लगता है कि किसी ऐसे क्षेत्र में लिंक हो रहा है जिसमें केवल एक अनोखी कमी हो। या इस लड़के के मामले में (जो मेरी तरह बिल्कुल आवाज करता है), उसे समाधान नहीं मिला।

यहाँ माता पिता तालिका है:

tblResponseTable definition (which maps to CodebookVersion) 
COLUMN_NAME TYPE_NAME 
id int identity 
versionTag nvarchar 
responseVersionTag nvarchar 

versionTag उस पर एक अद्वितीय contraint है, लेकिन वह कहीं भी प्रतिनिधित्व नहीं है कि मैं LINQ करने वाली एसक्यूएल सामान में देख सकते हैं - और कुछ भी नहीं के बाद से कभी को जाता है डेटाबेस ... अभी भी अटक गया।

1

चूंकि डेटाबेस नहीं कहा जा रहा है, मुझे लगता है कि आपको mqings linq को sql का उपयोग करना है। एसोसिएशन कैसा दिखता है? माता-पिता और बाल वर्ग दोनों पर एक एसोसिएशन होना चाहिए। दो वर्गों के बीच एसक्यूएल एसोसिएशन के लिए linq पर एक नज़र डालें। एसोसिएशन में यहकी संपत्ति होनी चाहिए। असफल होने वाली कलाकार उस संपत्ति के मूल्य को कास्ट करने की कोशिश कर रही है, जो मुझे लगता है। जहां तक ​​मैं कह सकता हूं कि एक से अधिक कुंजी होने पर एक समस्या हो सकती है और पहली कुंजी का प्रकार इस प्रकार के अंक से मेल नहीं खाता है। मुझे यकीन नहीं है कि linq निर्धारित करेगा कि पहली कुंजी क्या है। इसकी प्रकृति से आपके पास केवल एक कुंजी और एक विदेशी कुंजी है, इसलिए समस्या नहीं होनी चाहिए, लेकिन डिज़ाइनर, यदि आप इसका उपयोग कर रहे हैं, तो रचनात्मक होने के लिए जाना जाता है। मैं बहुत अनुमान लगा रहा हूं, लेकिन ऐसा लगता है कि मैंने पहले देखा है।

0

माइक, मैं आपको सुनता हूं। लेकिन कोई फर्क नहीं पड़ता कि मैं कहाँ देखता हूं, सब ठीक दिखता है। मैंने जांच की है और पुनः जांच की है कि ResponseTableId एक int है और आईडी एक int है। उन्हें डिजाइनर में परिभाषित किया गया है और जब मैं जेनरेट कोड को देखता हूं, तो सबकुछ फिर से क्रम में प्रतीत होता है।

मैंने एसोसिएशन की जांच की है। यहाँ वे हैं:

[Table(Name="dbo.tblResponseCode")] 
public partial class ResponseCode : ... 
    ... 
    [Association(Name="CodebookVersion_tblResponseCode", Storage="_CodebookVersion", ThisKey="ResponseCodeTableId", OtherKey="Id", IsForeignKey=true)] 
    public CodebookVersion CodebookVersion 
    { 
     ... 
    } 

[Table(Name="dbo.tblResponseCodeTable")] 
    public partial class CodebookVersion : ... 
    ... 
    [Association(Name="CodebookVersion_tblResponseCode", Storage="_ResponseCodes", ThisKey="Id", OtherKey="ResponseCodeTableId")] 
    public EntitySet<ResponseCode> ResponseCodes 
    { 
     ... 
    } 

और मामले में संघ का एक स्क्रीनशॉट में मदद मिलेगी:
designer

किसी भी आगे विचार?

0
ResponseCode rc = new ResponseCode() 
{ 
    CodebookVersion = codebookVersion, 
    SurveyQuestionName = "Q11", 
    Code = 3, 
    Description = "Yet another code" 
}; 
db.ResponseCodes.InsertOnSubmit(rc); 
db.SubmitChanges(); 
0

आप को देखने के लिए कि आपके डेटाबेस तालिकाओं में किसी भी क्षेत्र जो डाटाबेस सर्वर द्वारा स्थापित कर रहे हैं जब एक नया रिकार्ड डालने कि LINQ एसक्यूएल दिए गए चित्र में दिखाई देता है की जाँच कर सकते हैं। यदि आप लिंक से एसक्यूएल आरेख पर एक फ़ील्ड चुनते हैं और इसकी प्रॉपर्टी देखते हैं तो आपको "ऑटो जेनरेटेड वैल्यू" नामक एक फ़ील्ड दिखाई देगा, जो सही पर सेट होगा, यह सुनिश्चित करेगा कि सभी नए रिकॉर्ड डेटाबेस में निर्दिष्ट डिफ़ॉल्ट मान पर लें।

0

LINQ से SQL को बहिष्कृत कर दिया गया है, FYI - http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq-to-entities-roadmap.aspx

+0

डाउनवोट के लिए धन्यवाद। आप देखेंगे कि यह उत्तर 3 साल पुराना है और वह उस समय की बात थी। –

+0

मैंने दो कारणों से नीचे गिरा दिया: 1) यह ओपी में वर्णित सभी मुद्दों पर संबोधित नहीं है (मैं हाल ही में इस मुद्दे में भाग गया); और 2) विशेष रूप से जुड़े ब्लॉग पोस्ट में इसमें बहिष्कार का कोई उल्लेख नहीं है और इसके विपरीत "हम LINQ से SQL के संबंध में ग्राहकों को सुन रहे हैं और समुदाय से प्राप्त फीडबैक के आधार पर उत्पाद को विकसित करना जारी रखेंगे।" – DuckMaestro

+1

पर्याप्त मेला। स्पष्टीकरण के लिए धन्यवाद। –

0

मैं एक बहुत ही समान समस्या में भाग गया। मैं अपने शब्दों वाले पोस्ट करने के लिए आप पर लिंक कर देंगे: http://forums.asp.net/p/1223080/2763049.aspx

और मैं भी एक समाधान है, सिर्फ एक अनुमान ...

ResponseDataContext db = new ResponseDataContext(m_ConnectionString); 
    CodebookVersion codebookVersion = db.CodebookVersions.Single(cv => cv.VersionTag == m_CodebookVersionTag); 
    ResponseCode rc = new ResponseCode() 
    { 
     ResponseCodeTableId = codebookVersion.Id, 
     SurveyQuestionName = "Q11", 
     Code = 3, 
     Description = "Yet another code" 
    }; 
    db.ResponseCodes.InsertOnSubmit(rc); 
    db.SubmitChanges(); 
0

अपने वस्तु ग्राफ में कहीं वहाँ एक रूपांतरण त्रुटि है, तो प्रदान करेंगे अंतर्निहित डेटा मॉडल (या लिंक से एसक्यूएल मॉडल) बदल गया है। यह आम तौर पर NVARCHAR (1) -> CHAR जैसा होता है जब यह STRING होना चाहिए, या कुछ ऐसा ही होना चाहिए।

यह त्रुटि शिकार करने के लिए मजेदार नहीं है, उम्मीद है कि आपका ऑब्जेक्ट मॉडल छोटा है।

1

क्या यह bug का एक उदाहरण है? यदि ऐसा है, तो अब अपना कोड .NET 4.0 में चलाने का प्रयास करें कि बीटा बाहर है।

यदि मेरे जैसे, आप बीटा का उपयोग शुरू करने के लिए तैयार नहीं हैं, तो आप समस्या के आसपास काम करने में सक्षम हो सकते हैं। मुद्दा यह प्रतीत होता है कि LINQ गैर-प्राथमिक कुंजी फ़ील्ड पर परिभाषित संबंधों का सही ढंग से समर्थन नहीं करता है। हालांकि, "प्राथमिक कुंजी" शब्द SQL तालिका पर परिभाषित प्राथमिक कुंजी का संदर्भ नहीं देता है, लेकिन LINQ डिजाइनर में परिभाषित प्राथमिक कुंजी।

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

तो मेरे पास एक वैकल्पिक कुंजी का उपयोग करके एक दूसरे से संबंधित 2 टेबल/कक्षाएं थीं। अभिभावक तालिका में 2 कुंजी थी: एक सरोगेट प्राथमिक कुंजी एक int के रूप में परिभाषित की गई, और एक स्ट्रिंग के रूप में परिभाषित एक वैकल्पिक प्राकृतिक कुंजी। LINQ डिजाइनर में, मैंने वैकल्पिक कुंजी का उपयोग करके एसोसिएशन को परिभाषित किया था, और जब भी बच्चे ऑब्जेक्ट पर उस एसोसिएशन फ़ील्ड को अपडेट करने का प्रयास किया गया तो मैंने अमान्य कैस्टएक्सप्शन का अनुभव किया। इस के आसपास काम करने के लिए, मैं LINQ डिजाइनर में गया, int का चयन किया, और उसके बाद प्राथमिक कुंजी प्रॉपर्टी को True से False में बदल दिया। फिर मैंने स्ट्रिंग को चुना, और इसे प्राथमिक कुंजी प्रॉपर्टी को सही पर सेट किया। Recompiled, retested, और InvalidCastException चला गया है।

अपनी स्क्रीन को देखते हुए गोली मार दी ऐसा लगता है कि आप ResponseCode.ResponseCodeTableID को

0

हम एक ऐसी ही समस्या, गैर का उपयोग कर की वजह से था ResponseCode.ID से प्रतिक्रिया कोड पर LINQ प्राथमिक कुंजी बदल कर अपनी समस्या को हल करने में सक्षम हो सकता -इंटर कुंजी। विवरण और हॉटफिक्स संख्या यहां हैं: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=351358