में क्रॉस डेटाबेस क्वेरीिंग क्या एंटीटी फ्रेमवर्क में क्रॉस डेटाबेस क्वेरीिंग को लागू करने का कोई तरीका है? आइए कल्पना करें कि मेरे पास दो इकाइयां उपयोगकर्ता और पोस्ट हैं, उपयोगकर्ता इकाई डेटाबेस 1 में है और पोस्ट डेटाबेस 2 में है, जिसका अर्थ है कि वे संस्थाएं अलग-अलग डेटाबेस में हैं। मुझे इकाई फ्रेमवर्क में उपयोगकर्ता की पोस्ट कैसे प्राप्त करनी चाहिए?ईएफ
ईएफ
उत्तर
ईएफ संदर्भ क्रॉस डेटाबेस क्वेरी का समर्थन नहीं करता है। आपको SQL व्यू (or synonym) के माध्यम से डेटाबेस 1 में पोस्ट का पर्दाफाश करने की आवश्यकता है और इसे उस डेटाबेस के हिस्से के रूप में उपयोग करें।
+1 धन्यवाद Ladislav, तुमने मेरा दिन बचाया। – saber
बेशक यह काम नहीं करेगा यदि आप जिस डेटाबेस में शामिल होना चाहते हैं वह स्थानीय नहीं है। लिंक सर्वर भी खराब प्रदर्शन करता है। मेरी इच्छा है कि संदर्भ डाटाबेस स्वामित्व चेनिंग कॉन्फ़िगरेशन विकल्प का सम्मान करेगा क्योंकि यह एक मूल प्रमाणीकरण समस्या जैसा लगता है जिसे आसानी से दूर किया जा सकता है। – ewahner
नहीं, आप नहीं कर सकते। आपको संदर्भों को बनाना होगा और अपने आप में शामिल होना होगा। here देखें।
आप डेटाबेस ट्रिकरी को हल कर सकते हैं, एक डेटाबेस में एक दृश्य बनाकर दूसरे में एक तालिका को दर्शाता है।
आप 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; }
...
}
+1 अच्छा बिंदु। सबसे सरल समाधान अक्सर सबसे अच्छा है। –
मैं जानता हूँ कि यह है एक पुराना धागा, लेकिन, वास्तव में। यह संभव है। यदि डेटाबेस एक ही सर्वर पर हैं, तो आपको केवल 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 की आवश्यकता है।
[इकाई फ्रेमवर्क का संभावित डुप्लिकेट - विभिन्न डेटाबेस में तालिकाओं का प्रबंधन कैसे करें, लेकिन उसी सर्वर पर?] (Http://stackoverflow.com/questions/11544516/entity-framework-how-to-manage-tables-in -विशिष्ट-डेटाबेस-पर-पर-समान-एस) – ken2k
हां मैंने डेटाबेस 1 में पोस्ट का खुलासा किया, लेकिन मुझे समझ में नहीं आया, एसक्यूएल व्यू या उपनाम ** के माध्यम से ** आपका क्या मतलब है? – saber