2013-01-15 8 views
11

में क्रॉस डेटाबेस क्वेरीिंग क्या एंटीटी फ्रेमवर्क में क्रॉस डेटाबेस क्वेरीिंग को लागू करने का कोई तरीका है? आइए कल्पना करें कि मेरे पास दो इकाइयां उपयोगकर्ता और पोस्ट हैं, उपयोगकर्ता इकाई डेटाबेस 1 में है और पोस्ट डेटाबेस 2 में है, जिसका अर्थ है कि वे संस्थाएं अलग-अलग डेटाबेस में हैं। मुझे इकाई फ्रेमवर्क में उपयोगकर्ता की पोस्ट कैसे प्राप्त करनी चाहिए?ईएफ

+0

[इकाई फ्रेमवर्क का संभावित डुप्लिकेट - विभिन्न डेटाबेस में तालिकाओं का प्रबंधन कैसे करें, लेकिन उसी सर्वर पर?] (Http://stackoverflow.com/questions/11544516/entity-framework-how-to-manage-tables-in -विशिष्ट-डेटाबेस-पर-पर-समान-एस) – ken2k

+0

हां मैंने डेटाबेस 1 में पोस्ट का खुलासा किया, लेकिन मुझे समझ में नहीं आया, एसक्यूएल व्यू या उपनाम ** के माध्यम से ** आपका क्या मतलब है? – saber

उत्तर

20

ईएफ संदर्भ क्रॉस डेटाबेस क्वेरी का समर्थन नहीं करता है। आपको SQL व्यू (or synonym) के माध्यम से डेटाबेस 1 में पोस्ट का पर्दाफाश करने की आवश्यकता है और इसे उस डेटाबेस के हिस्से के रूप में उपयोग करें।

+0

+1 धन्यवाद Ladislav, तुमने मेरा दिन बचाया। – saber

+0

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

4

नहीं, आप नहीं कर सकते। आपको संदर्भों को बनाना होगा और अपने आप में शामिल होना होगा। here देखें।

आप डेटाबेस ट्रिकरी को हल कर सकते हैं, एक डेटाबेस में एक दृश्य बनाकर दूसरे में एक तालिका को दर्शाता है।

+0

स्वीकार्य हो सकता है यदि डीबी एक ही मेजबान पर है और डेटा सेट छोटे हैं, लेकिन आम तौर पर, क्लाइंट पक्ष बुरी तरह प्रदर्शन करता है। – Andomar

+0

+1 आपके उत्तर के लिए धन्यवाद। – saber

9

आप ExecuteStoreQuery, की तरह उपयोग कर सकते हैं:

var myOb = context.ExecuteStoreQuery<PlainOldClrObject>(
     @"select * 
      from db1.dbo.table1 t1 
      join db2.dbo.table2 t2 
      on  t2.t1_id = t1.id 
      where t1.id = {0}", 
     table1Id).FirstOrDefault(); 

की तरह, getters/setters साथ गुण के रूप में कॉलम के साथ एक PlainOldClrObject वर्ग को परिभाषित करने के लिए आपके पास होगी:

class PlainOldClrObject 
{ 
    public int Id (get; set; } 
    public int Name (get; set; } 
    ... 
} 
+0

+1 अच्छा बिंदु। सबसे सरल समाधान अक्सर सबसे अच्छा है। –

13

मैं जानता हूँ कि यह है एक पुराना धागा, लेकिन, वास्तव में। यह संभव है। यदि डेटाबेस एक ही सर्वर पर हैं, तो आपको केवल DbCommandInterceptor का उपयोग करना होगा।

उदाहरण के तौर पर, यदि मैं DbCommandInterceptor से MyContext, संलग्न करता हूं तो मैं सभी कमांड निष्पादन को रोक सकता हूं और मेरे पूर्ण-डीबी पथों के साथ क्वेरी में निर्दिष्ट तालिका (ओं) को प्रतिस्थापित कर सकता हूं।

  public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) 
    { 
     // Here, I can just replace the CommandText on the DbCommand - but remember I 
     // want to only do it on MyContext 
     var context = contexts.FirstOrDefault() as MyContext; 
     if (context != null) 
     { 
      command.CommandText = command.CommandText 
       .Replace("[dbo].[ReplaceMe1]", "[Database1].[dbo].[Customers]") 
       .Replace("[dbo].[ReplaceMe2]", "[Database2].[dbo].[Addresses]") 
       .Replace("[dbo].[ReplaceMe3]", "[Database3].[dbo].[Sales]"); 
     } 

     base.ReaderExecuting(command, interceptionContext); 
    } 

अच्छी बात यह भी इस दृष्टिकोण के बारे में है कि एफई मॉडल मानचित्रण अभी भी ठीक से काम करता है और सम्मान स्तंभ गुण, कोई भी दृश्य नहीं की आवश्यकता है, और कोई संग्रहीत procs की आवश्यकता है।