2011-07-09 9 views
6

में संग्रहित प्रक्रियाओं के साथ काम करता है, मैं जानना चाहता हूं कि कोई अच्छा ORM है जो कुछ मैन्युअल कार्य को स्वचालित कर सकता है जो मुझे अभी करना है। हमारा आवेदन संग्रहित प्रक्रियाओं का भारी उपयोग करता है, जिसका अर्थ है कि डेटाबेस के साथ कोई भी बातचीत एक संग्रहीत प्रक्रिया के माध्यम से जाती है।ओआरएम जो एएसपी.नेट 4 और एसक्यूएल सर्वर

अभी, मुझे पारंपरिक तरीके से संग्रहित प्रक्रियाओं को कॉल करना है, और यह काफी कठिन है। वहाँ एक ORM कि संग्रहित प्रक्रियाओं है कि के साथ काम पर एक अच्छा काम करता है:

  1. इनपुट/आउटपुट पैरामीटर संरचित कर रहे हैं, जिसका अर्थ है उत्पादन मानकों उपयोगकर्ता परिभाषित प्रकार होने के लिए तालिका मूल्यवान प्रकार
  2. आसानी से अनुमति देते हैं, दोनों अदिश और तालिका मूल्यवान
  3. वापसी कई रिकॉर्ड सेट
+0

संभव डुप्लिकेट [कौन सी ओआरएम संग्रहीत प्रक्रियाओं का उपयोग करते समय सबसे अच्छा है] (http://stackoverflow.com/questions/687762/which-orm-is-the-best-when-using-stored-procedures) – jgauffin

+0

@ jgauffin: मुझे लगता है कि यह सवाल 2 साल के बाद मान्य है। मार्च 200 9 – gbn

+0

के बाद से सभी नई चीजों के बारे में सोचें यह एक डुप्लिकेट नहीं है। मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या एक ओआरएम या एडाप्टर पैरामीटर में मूल्यवान तालिका के साथ उचित नौकरी कर सकता है, जबकि ado.net क्या करता है। – Candide

उत्तर

8

Dapper काफी व्यापक रूप से संग्रहीत प्रक्रिया समर्थन है।

तुच्छ:

create proc spGetOrder 
    @Id int 
as 
select * from Orders where Id = @Id 
select * from OrderItems where OrderId = @Id 

यह निम्नलिखित के साथ मैप किया जा सकता।

  1. एक बहु नक्शाकार कि आप एकल पंक्तियों से अधिक ऑब्जेक्ट को
  2. इनपुट, आउटपुट और वापसी पैरामीटर समर्थन डेटाबेस विशिष्ट के लिए
  3. एक एक्स्टेंसिबल इंटरफ़ेस अनुमति देता है:

    var grid = cnn.QueryMultiple("spGetOrder", new {Id = 1}, commandType: CommandType.StoredProcedure); 
    var order = grid.Read<Order>(); 
    order.Items = grid.Read<OrderItems>(); 
    

    इसके अतिरिक्त आप के लिए समर्थन पैरामीटर हैंडलिंग (टीवीपी की तरह)

तो उदाहरण के लिए:

create proc spGetOrderFancy 
    @Id int, 
    @Message nvarchar(100) output 
as 
set @Message = N'My message' 
select * from Orders join Users u on OwnerId = u.Id where Id = @Id 
select * from OrderItems where OrderId = @Id 
return @@rowcount 

साथ मैप किया जा सकता है:

var p = new DynamicParameters(); 
p.Add("Id", 1); 
p.Add("Message",direction: ParameterDirection.Output); 
p.Add("rval",direction: ParameterDirection.ReturnValue); 
var grid = cnn.QueryMultiple("spGetOrder", p, commandType: CommandType.StoredProcedure); 
var order = grid.Read<Order,User,Order>((o,u) => {o.Owner = u; return o;}); 
order.Items = grid.Read<OrderItems>(); 

var returnVal = p.Get<int>("rval"); 
var message = p.Get<string>("message"); 

अंत में, साफ-सुथरी भी एक कस्टम पैरामीटर कार्यान्वयन के लिए अनुमति देता है:

public interface IDynamicParameters 
{ 
    void AddParameters(IDbCommand command); 
} 

जब इस इंटरफेस को लागू आप डैप्पर क्या मापदंडों बता सकते हैं आप अपने आदेश में जोड़ना चाहते हैं। यह आपको टेबल-मूल्यवान पैरामीटर और अन्य डेटाबेस विशिष्ट विशेषताओं का समर्थन करने की अनुमति देता है।

You're using it now on Stack Overflow ...

+3

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

+0

@ रोलैंड टीवीपीएस में एक बहुत ही अजीब एपीआई है। एक साफ सहायक में इसे लपेटना इतना आसान नहीं है, अगर आप एक आईनेमेरेबल में गुजर रहे हैं तो इस प्रकार के नाम का पता लगाने के लिए एक तरीका होना चाहिए। मैं देखूंगा कि क्या मैं परीक्षा बढ़ा सकता हूं, क्या आप टिकट बढ़ा सकते हैं ताकि मैं –

+1

@gbn ट्रैक कर सकूं ... मेरा संपादन देखें ... विस्तार का एक गुच्छा जोड़ा गया –

1

अगर स्मृति में कार्य करता है, LINQ to SQL संग्रहित प्रक्रियाओं के लिए तरीकों को मैप करने की क्षमता है। जब आप Visual Studio के अंदर LINQ     SQL संदर्भ बनाते हैं, तो आप अपने डेटाबेस को कनेक्ट कर सकते हैं और तालिका को डिज़ाइन व्यू में खींच और छोड़ सकते हैं। यह किसी भी संग्रहित प्रक्रियाओं का पता लगाएगा और मॉडल ऑब्जेक्ट्स के अंदर आवश्यक विधियों को उत्पन्न करेगा।

Scott Guthrie ब्लॉग पोस्ट LINQ to SQL (Part 6 - Retrieving Data Using Stored Procedures) देखें।

+0

की आवश्यकता है और यह पता चला कि यह उपयोगकर्ता परिभाषित प्रकारों के लिए विशेष रूप से तालिका प्रकारों में काम नहीं करता है। – Candide

+0

उस ब्लॉग पोस्ट के अंत में उपयोगकर्ता परिभाषित प्रकारों के लिए समर्थन का उल्लेख है –

+0

शायद मुझे कुछ याद आ रहा है, लेकिन मुझे लगता है कि यह उपयोगकर्ता परिभाषित कार्यों का जिक्र कर रहा है। साथ ही, यह काम करता है यदि एक परिभाषित प्रकार बल्कि आदिम (टाइपिफ़ के बराबर) है, लेकिन अधिक जटिल प्रकारों के लिए नहीं। एसक्यूएल सर्वर में उपयोगकर्ता परिभाषित तालिका प्रकार linq2sql के लिए उपलब्ध नहीं हैं, मैंने दावा करते हुए कई पोस्ट पढ़ी हैं। हालांकि, उत्तर के लिए धन्यवाद। – Candide

2

Entity Framework देखें।

+0

ईएफ काफी अच्छा है और तालिका उपयोगकर्ता परिभाषित प्रकारों को छोड़कर मुझे लगभग हर चीज की आवश्यकता होती है। Linq2sql में भी वही दोष है। – Candide

+0

दूसरी तरफ, केवल ईएफ 4 आपको इकाइयों को सम्मिलित करने, अद्यतन करने, हटाने के लिए संग्रहीत प्रोसेस निर्दिष्ट करने की अनुमति देता है। इसके अलावा, ईएफ 4 आपको संग्रहित प्रो परिणामों के लिए अपनी मैपिंग फ़ाइल में आसानी से नए "जटिल प्रकार" बनाने की अनुमति देता है जो किसी मौजूदा इकाई (या संस्थाओं का संग्रह) से मेल नहीं खाता है –

+0

@marc_s लेकिन कुछ तरीकों से आपके ओआरएम की सीमाएं परिभाषित कर रही हैं टीएसक्यूएल कोडिंग की शैली आपको अनुवर्ती करने की अनुमति है। टीवीपी के लिए समर्थन काटने से बैचों के सम्मिलन जटिल हो सकते हैं, खासकर यदि आप विस्तृत डुप्लिकेट हैंडलिंग चाहते हैं। –

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