क्या एंटीटी फ्रेमवर्क/System.Data.Entity.dll पर निर्भरता पेश किए बिना EdmFunctionAttribute
का लाभ उठाने का कोई अच्छा तरीका है?एंटिटी फ्रेमवर्क निर्भरता/कार्यान्वयन विवरण को उजागर किए बिना EdmFunctionAttribute का उपयोग करें?
मैंने सोचा कि मेरे पास एक विधि और एक ठोस कार्यान्वयन के साथ एक इंटरफ़ेस हो सकता है जो इसे डेटाबेस फ़ंक्शन पर मैप करने के लिए EdmFunctionAttribute
का उपयोग करके विधि लागू करता है।
मेरे पास एक असेंबली में एक संदर्भ इंटरफेस IMyContext
एक असेंबली और एक इकाई फ्रेमवर्क कार्यान्वयन MyContext
में परिभाषित किया गया है।
public interface IMyContext
{
double SomeFunction(double first, double second);
// other interface details here
}
public partial class MyContext : IMyContext
{
[EdmFunction("MyNamespace", "MyDatabaseFunction")]
public double SomeFunction(double first, double second)
{
throw new NotSupportedException("This method may only be called as part of a LINQ expression.");
}
// rest of interface implementation here
}
मैं एक कारखाने (पर्दे के पीछे StructureMap का उपयोग) का उपयोग इंटरफ़ेस प्रकार के रूप में एक संदर्भ उदाहरण पाने के लिए:
using (IMyContext context = ContextFactory.GetNewContext())
{
var results = context.Table.Select(t => context.SomeFunction(t.Col1, t.Col2)).ToList();
}
यह एक NotSupportException
कह रही है कि LINQ संस्थाओं के लिए विधि 'को नहीं पहचानता है फेंकता डबल कुछ समारोह (डबल, डबल) '।
अगर मैं
using (MyContext context = ContextFactory.GetNewContext() as MyContext)
{
...
}
तो ठोस कार्यान्वयन के लिए संदर्भ डाली यह काम करता है, लेकिन फिर मैं ठोस कार्यान्वयन, जो मैं नहीं करना चाहते हैं निर्दिष्ट करने के लिए आवश्यक कर रहा हूँ।
फ़ंक्शन को संदर्भ वर्ग का सदस्य नहीं होना चाहिए, मैंने इसे एक्सप्लोर करने के लिए वहां रखा है।
मुझे एक ही स्थिति का सामना करना पड़ रहा है। मैं भी उम्मीद कर रहा था कि इंटरफ़ेस संदर्भ के माध्यम से एक्सेस किए जाने पर EdmFunctionAttribute को हल किया जाएगा, लेकिन इसका कोई फायदा नहीं हुआ। कई संदर्भों (एकाधिक डेटाबेस) के साथ काम करते समय यह और भी मुश्किल हो जाता है। – kdawg
इसके लायक होने के लिए, मैं इस मुद्दे को हल नहीं कर सका और मुझे अपने रिपोजिटरी (आपके मामले में संदर्भ) के ठोस कार्यान्वयन पर डीबी फ़ंक्शन को थप्पड़ मारना पड़ा, जिसका अर्थ है कि सभी फ़ंक्शन कॉल मेरे रिपोजिटरी कक्षा में रहनी चाहिए - यानी: मेरा क्लाइंट कोड सीधे इसका उपयोग नहीं कर सका। मैं इसके साथ रोमांचित नहीं हूं, लेकिन यह काम करता है (और यह रिपोजिटरी के भीतर रहने के लिए कोड पूछताछ करता है, जो कुछ तर्क देंगे कि यह कहां से संबंधित है)। – kdawg