2014-10-08 5 views
8

मैं ODataConventionModelBuilder उपयोग कर रहा हूँ इस तरह वेब एपीआई OData सेवा के लिए EDM मॉडल का निर्माण करने के:ODataConventionModelBuilder को सभी व्युत्पन्न प्रकारों के मेटाडेटा को स्वचालित रूप से बेनकाब करने के लिए कैसे रोकें?

ODataModelBuilder builder = new ODataConventionModelBuilder(); 

builder.Namespace = "X"; 

builder.ContainerName = "Y"; 

builder.EntitySet<Z>("Z"); 

IEdmModel edmModel = builder.GetEdmModel(); 

कक्षा जेड एक विधानसभा में स्थित है, और वहाँ है सार्वजनिक वर्ग क्यूजेड से ली गई विभिन्न असेंबली में स्थित है।

ODataConventionModelBuilder इच्छा उत्पन्न करता Edm मॉडल कि (अन्य व्युत्पन्न वर्ग के बीच में) वर्ग क्यू की परिभाषा और यह सेवा मेटाडाटा के साथ संपर्क में आएंगे, भी शामिल है। यह हमारे मामले में अवांछनीय है।

जब पहुंच योग्य वर्ग (जैसे आंतरिक के रूप में परिभाषित) ऐसी समस्या, निश्चित रूप से मौजूद नहीं है।

क्या ओडेटा कॉन्वेन्शनमोडेलबिल्डर को सभी व्युत्पन्न प्रकारों के मेटाडेटा को स्वचालित रूप से बेनकाब करने के लिए कोई तरीका नहीं है?

उत्तर

8

यह काम करना चाहिए:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 

builder.Namespace = "X"; 

builder.ContainerName = "Y"; 

builder.EntitySet("Z"); 

builder.Ignore<Q>(); 

IEdmModel edmModel = builder.GetEdmModel(); 
+0

एक आकर्षण की तरह काम करता है, धन्यवाद! मैं इसे कैसे याद कर सकता हूं ... –

+1

यह स्वचालित खोज को रोकता नहीं है। मेरे पास दर्जनों विरासत वाली संस्थाएं हैं, जिनमें से प्रत्येक को अलग-अलग अनदेखा करना अनदेखा नहीं है, और कुछ "अनुक्रम में कई तत्व हैं" त्रुटि के साथ समाप्त होता है। – Jerther

+0

और यह डिज़ाइन द्वारा है: https://aspnetwebstack.codeplex.com/workitem/1928 – Jerther

4

वहाँ स्वत: खोज को अक्षम करने का कोई तरीका नहीं है और इस डिजाइन कर रहा है। here देखें।

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

var builder = new ODataConventionModelBuilder(); 
builder.Namespace = "X"; 
builder.ContainerName = "Y"; 
builder.EntitySet<Z>("Z"); 

var types = AppDomain.CurrentDomain.GetAssemblies() 
    .SelectMany(a => a.GetTypes()) 
    .Where(t => t.IsSubclassOf(typeof(Z))); 

foreach (var type in types) 
    builder.Ignore(types.ToArray()); 

//additional mapping of derived types if needed here 

var edmModel = builder.GetEdmModel(); 

अधिक जानकारी के लिए my blog post देखें।

+0

बिल्डर के रूप में फ़ोरैच लूप का कोई उपयोग नहीं दिखता है। अनदेखा करें() सरणी स्वीकार करता है। – Rahul

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

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