2009-04-26 28 views
9

के साथ संग्रहीत प्रक्रिया निष्पादित नहीं कर सकता है मैंने एक सरल पैरामीटर रहित संग्रहित प्रक्रिया बनाई है जिसे मैंने नीचे चिपकाया है। मैंने संग्रहीत प्रक्रिया को मेरे एंटिटी मॉडल में आयात किया है और एक फ़ंक्शन आयात बनाया है। मॉडल में फ़ंक्शन कभी नहीं बनाया गया है और मैं ADO.NET इकाई फ्रेमवर्क का उपयोग करके इस संग्रहित प्रक्रिया को निष्पादित करने में असमर्थ हूं। मैंने XML व्यू में .edmx फ़ाइल खोली है और पुष्टि की है कि इस संग्रहीत प्रक्रिया के बारे में कोई त्रुटि नहीं है। मैं क्या गलत कर रहा हूं? क्या एंटिटी फ्रेमवर्क से ऐसी सरल संग्रहित प्रक्रिया को कॉल करना वास्तव में असंभव है? मैंने आयात फ़ंक्शन के लिए रिटर्न प्रकार सेट किया है, इस संग्रहित प्रक्रिया को किसी भी रिकॉर्डसेट या मानों को वापस करने की आवश्यकता नहीं है।एडीओ.NET इकाई फ्रेमवर्क

संग्रहित प्रक्रिया:

Dim db As New MilkModel 

db.Inventory_Snapshot_Create() 

उत्तर

6

धन्यवाद, pmarflee।

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

Dim db As New MilkModel 

'== 
'Begin dirty hack to execute parameterless/resultless stored 
'procedure using Entity Framework (well, sort of using EF). 
'http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/44a0a7c2-7c1b-43bc-98e0-4d072b94b2ab/ 
'== 
Dim con As DbConnection = db.Connection 

con.Open() 

Dim cmd As DbCommand = con.CreateCommand() 

With cmd 
    .CommandType = CommandType.StoredProcedure 
    .CommandText = "MilkModel.Inventory_Snapshot_Create" 
    .ExecuteNonQuery() 
    .Dispose() 
End With 

con.Dispose() 
'== 
'End dirty hack 
'== 
+0

काम के लिए धन्यवाद के आसपास, मैं भी विश्वास नहीं कर सकता है कि आप इस हालांकि संग्रहित प्रक्रियाओं फोन नहीं कर सकते हैं। लेकिन जैसा कि pmarflee द्वारा बताया गया है, तर्क यह है कि यदि आप अपने ईएफ में टेबल को संशोधित कर रहे हैं तो आप इसका उपयोग नहीं कर रहे हैं। – greektreat

+2

किसी हैक की कोई आवश्यकता नहीं है इसे देखें: http://msdn.microsoft.com/en-us/library/bb896231.aspx –

3

मैं तुम्हें जब तक कि यह एक विशेष से संबद्ध किसी एफई मॉडल के लिए एक संग्रहीत प्रक्रिया में जोड़ सकते हैं नहीं लगता है:

ALTER PROC [dbo].[Inventory_Snapshot_Create] 

AS 

SET NOCOUNT ON 

DECLARE @Inventory_Snapshot_ID int 

INSERT INTO Inventory_Snapshots (snapshot_timestamp) 
VALUES (GETDATE()) 

SET @Inventory_Snapshot_ID = SCOPE_IDENTITY() 

INSERT INTO Inventory_Snapshot_Products (inventory_snapshot_id, 
    idProduct, stock) 

    SELECT @Inventory_Snapshot_ID, idProduct, stock 
    FROM products 


SET NOCOUNT OFF 

कोड संग्रहीत प्रक्रिया निष्पादित करने के लिए कोशिश कर रहा है एक इकाई पर सीआरयूडी ऑपरेशन। हालांकि आप ईएफ उपयोग कर रहे अंतर्निहित ADO.NET कनेक्शन ऑब्जेक्ट तक पहुंचने के लिए कनेक्शन अपनी इकाई कंटेनर ऑब्जेक्ट की संपत्ति का संदर्भ दे सकते हैं। फिर आप पारंपरिक एडीओ.NET कोड का उपयोग करके अपनी संग्रहीत प्रक्रिया को कॉल कर सकते हैं।

+2

यह वास्तव में बेकार है। –

11

सबसे पहले आप मॉडल में जोड़ने, तो आप इकाई कंटेनर पर जाएं, फिर आयात समारोह:

यहाँ मैं क्या कर समाप्त हो गया है।

पूर्ण यहाँ विवरण:

http://msdn.microsoft.com/en-us/library/bb896231.aspx

+0

यह बिल्कुल सही है। यहां बुरा हैक्स की आवश्यकता नहीं है - आपको बस दस्तावेज़ों को पढ़ने की जरूरत है। – Stuart

0

अगर, एक DBCommand का उपयोग कर से बचना चाहते हैं मैं इसे सपा स्तंभों को एक इकाई परिभाषा के साथ मेल के कुछ सेट लौट बनाकर काम कर दिया।

4

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

अब आप इसे अपने कोड में कॉल करते हैं।

इसकी जटिल प्रकार उपयोग कोड लौटा रहा हो तो: जाएँ

http://dubeyniraj.blogspot.com/

+0

यदि आप ईएफ 5 का उपयोग कर रहे हैं तो कोई फ़ंक्शन आयात नहीं है, आप फ़ंक्शन आयात के बिना सीधे उन्हें एक्सेस कर सकते हैं। – Niraj

1

में आगे प्रश्नों के लिए MyEntities _entities = new MyEntities(); _entities.Cancel_Sale(ucode, oid);

:

MyEntities _entities = new MyEntities(); var p = from d in _entities.GetOrderInfo() select d;

अगर इसकी लौटने कुछ भी नहीं तो कोड का उपयोग इस बारे में किसी और के बारे में आश्चर्य ...

संग्रहीत procs और इकाई की रूपरेखा के साथ मुख्य समस्या यह है कि वापसी प्रकार definted किए जाने की जरूरत है। उदाहरण के लिए, यदि आपके पास एक संग्रहित प्रो है जो तालिका से सोम पंक्तियां लौटाती है, तो इकाई फ्रेमवर्क को बताया जाना चाहिए कि उन पंक्तियों की संरचना कैसा दिखता है। इसकी आवश्यकता है ताकि यह सभी प्रॉक्सी कक्षाएं उत्पन्न कर सके और चीजों को क्रमबद्ध और deserialize कर सकते हैं।

जब आप मॉडल पर जाते हैं - rigkt क्लिक - इनपोर्ट फ़ंक्शन, आप एक संग्रहित प्रो चुन सकते हैं, लेकिन यह अपेक्षा करता है कि रिटर्न प्रकार किसी भी, स्केलर या इकाई प्रकार (आपके डेटाबेस में टेबल के आधार पर) । यदि आप चाहें तो एक जटिल प्रकार जोड़ सकते हैं। राइट क्लिक मॉडल - एड - कॉम्प्लेक्स टाइप चुनें। फिर आप कॉलम और उनके डेटा प्रकार को परिभाषित करते हैं।

इस बार किया जाता है, वर्ग आपने अभी बनाया ऊपर उल्लेख इकाई प्रकारों की सूची के नीचे दिखाई देगा।

1

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

लेकिन वैसे भी अगर मैं (समारोह) किसी कारण कुछ भी नहीं होता के लिए के भीतर कुछ डालने से संचालित होने वाले एक संग्रहीत प्रक्रिया आयात करते हैं,। दूसरे शब्दों में अगर मैं (EDCX) इस तरह के सपा अपने मॉडल को जोड़ें:

create procedure insert_stuff(thing varchar(40)) 
returns response(50) 
as 
begin 
    insert into stuffs(thing) values (thing); 

    response = 'done!'; 

    suspend; 
end; 

और उसके बाद मैं इस तरह से यह कहते हैं:

FirebirdContext.InsertStuff("Hi there!"); // it should return an ObjectResult<String> 
FirebirdContext.SaveChanges(); 

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

तालिका बहुत ही सरल दिखाया गया है और मैं पहले से ही अन्य संग्रहित प्रक्रियाओं आयातित और वे काम करते हैं, लेकिन क्योंकि वे प्रश्नों, अद्यतन होते हैं और हटा सकते हैं, मामले में वे सम्मिलित ... कोई रास्ता मिल गया है! क्या यह फायरबर्ड एडो.NET प्रदाता में एक बग हो सकता है? या क्या मुझे कुछ याद करना है जो मैंने याद किया है?

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