पहले EF कोड के CTP5 के लिए ProxyCreationEnabled को बंद करने के लिए डाउनसाइड क्या हैं


82

एक ही रास्ता है कि मेरे WCF सेवा एक कोड पहला मॉडल से कक्षाएं लौट सकते हैं की स्थापना कर रहा है ProxyCreationEnableकरने के लिए falseनीचे दिए गए कोड का उपयोग कर।

((IObjectContextAdapter)MyDb).ObjectContext.ContextOptions.ProxyCreationEnable = false;

ऐसा करने के नकारात्मक परिणाम क्या हैं? एक लाभ यह है कि मैं कम से कम इन गतिशील प्रकारों को क्रमबद्ध कर सकता हूं ताकि उन्हें WCF का उपयोग करके तार पर भेजा जा सके।

जवाबों:


71

डायनामिक प्रॉक्सी का उपयोग परिवर्तन ट्रैकिंग और आलसी लोडिंग के लिए किया जाता है। जब WCF ऑब्जेक्ट को अनुक्रमित करने की कोशिश करता है, तो संबंधित संदर्भ आमतौर पर बंद और निपटारा होता है लेकिन नेविगेशन गुणों का क्रमांकन स्वचालित रूप से आलसी लोडिंग (बंद संदर्भ पर) => अपवाद को ट्रिगर करेगा।

यदि आप आलसी लोडिंग को बंद कर देते हैं, तो आपको उन सभी नेविगेशन गुणों के लिए उत्सुक लोडिंग का उपयोग करना होगा, जिन्हें आप उपयोग करना चाहते हैं (ObjectQuery पर शामिल करें)। ट्रैकिंग परिवर्तन WCF पर काम नहीं करता है यह केवल इकाई के संशोधन के लिए काम करता है जो ObjectContext से जुड़ा हुआ है।


7
ProxyCreationEnabled अक्षम करने के लिए कोई प्रदर्शन लाभ है? मैं अक्सर एक DbContext उदाहरण को हड़पने के लिए उत्सुक लोडिंग के साथ पढ़ता हूं, उदाहरण के लिए।
क्रिस मोसिनची

2
@ChrisMoschini "जब एक POCO इकाई में परिवर्तन ट्रैकिंग प्रॉक्सी नहीं होता है, तो पिछली सहेजे गए राज्य की प्रति के साथ आपकी संस्थाओं की सामग्री की तुलना करके परिवर्तन पाए जाते हैं। यह गहरी तुलना एक लंबी प्रक्रिया बन जाएगी जब आपके संदर्भ में कई संस्थाएँ होंगी। , या जब आपकी संस्थाओं में बहुत अधिक मात्रा में संपत्ति होती है, भले ही उनमें से कोई भी आखिरी तुलना के बाद बदल न जाए। " msdn.microsoft.com/en-us/library/hh949853(v=vs.113).aspx
Niklas Peter

75

यदि DbContext.Configuration.ProxyCreationEnabledसेट किया गया है false, तो DbContext किसी मूल वस्तु के लिए बाल वस्तुओं को तब तक लोड नहीं करेगा, जब तक कि Includeविधि को पैरेंट ऑब्जेक्ट पर नहीं कहा जाता है। पर सेट DbContext.Configuration.LazyLoadingEnabledकरने trueया falseउसके व्यवहार पर कोई प्रभाव नहीं पड़ेगा।

यदि DbContext.Configuration.ProxyCreationEnabledइसे सेट किया जाता है true, तो बाल वस्तुओं को स्वचालित रूप से लोड किया जाएगा, और DbContext.Configuration.LazyLoadingEnabledजब बाल वस्तुओं को लोड किया जाएगा तो मूल्य नियंत्रित होगा।


10

जब आप EF का उपयोग करते हैं, तो यह आपकी कक्षा के लिए डिफ़ॉल्ट रूप से एक प्रॉक्सी बनाता है। इसका समाधान आपके DbContext क्लास के कंस्ट्रक्टर में इस लाइन को जोड़ना हो सकता है। आपका डेटा मॉडल DbContext वर्ग से विरासत में मिला है, इसलिए आप अपने मॉडल को इस तरह संपादित कर सकते हैं:

    public yourDataModelEntities()
        : base("name=yourDataModelEntities")
    {
        base.Configuration.ProxyCreationEnabled = false;
    }

यह वर्ग अपने में है EF.edmxमें तो yourmodel.Context.ttफिरyourmodel.Context.cs


2
यह कोई जवाब नहीं है लेकिन इसने मेरी मदद की।
अकीरा यामामोटो

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

@konrad - एक आंशिक वर्ग में कोड बनाएं ताकि यह ओवरराइड न हो। सार्वजनिक आंशिक वर्ग yourDataMoldelEntities ()
Mikee

@ मायके सचमुच? मुझे उम्मीद है कि आंशिक वर्ग में मेरे द्वारा लिखे गए ऑटो-जेनरेट किए गए कंस्ट्रक्टर के कारण किसी तरह की समस्या हो सकती है ...
कोनराड विल्टरस्टन

@ कोनराड ने आपको आंशिक कोड 'टाइप' बनाने के लिए आपको एक तरीका दिया है जिसमें आपका कोड ओवरराइट नहीं किया गया है
मिकी

6

(दृश्य स्टूडियो 2013 या उसके बाद का उपयोग करना)

हर बार जब आप डेटाबेस से मॉडल को रिफ्रेश करते हैं, या किसी अन्य तरीके से कोड के पुनर्निर्माण को ट्रिगर करते हैं, तो E4 मॉडल में क्लास कंस्ट्रक्टर के संपादन से बचने के लिए, परिवर्तन करने के लिए उचित स्थान T4 कोड फ़ाइल में है जो कि जिम्मेदार है वास्तव में मॉडल कोड बनाना। मेरे पास कुछ साल पहले गतिशील गुणों के साथ कुछ अन्य मुद्दा था जब मैंने अंतर्निहित यांत्रिकी को समझा कि कैसे कक्षाएं और गुण वास्तव में बनाए गए थे। टी -4 !!! यह एक चमत्कार क्या है: -D T4 सिंटैक्स पहली बार में थोड़ा डराने वाला हो सकता है, इसलिए सिंटैक्स पर पढ़ना समझदारी है। परिवर्तन करते समय बहुत ध्यान केंद्रित करना भी एक अच्छा विचार है :-)

इसलिए! यदि आप अपने मॉडल में देखते हैं, तो आपके पास .edmx फ़ाइल के अंतर्गत एक .tt फ़ाइल है। यह .tt (T4) फ़ाइल वह स्क्रिप्ट है जो वास्तव में आपका मॉडल वर्ग बनाती है। प्रत्येक बार जब आप अपना मॉडल बनाते हैं या मॉडल संपादक में कुछ बदलाव करते हैं, तो स्क्रिप्ट स्वचालित रूप से चलाई जाएगी।

मान लीजिए कि आपके मॉडल विवरणक का नाम Model1.edmx है । आपके पास पेड़ के नीचे Model1.Context.tt नाम की एक फ़ाइल होगी । आपको एक Model1.Context.cs फ़ाइल भी दिखाई देगी । यह स्पष्ट रूप से आपके संदर्भ के लिए वास्तविक कोड फ़ाइल है। लेकिन यह फ़ाइल .tt स्क्रिप्ट फ़ाइल चलाने का परिणाम है ! यह पूरी तरह से गतिशील रूप से बनाया गया है। तो इसे संपादित करने का कोई विचार नहीं है।

.Tt फ़ाइल खोलें और आपको कुछ इस तरह दिखाई देगा:

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@
 output extension=".cs"#><#

const string inputFile = @"Model1.edmx";
var textTransform = DynamicTextTransformation.Create(this);
..
..

एक और 50 या तो नीचे लाइनों, कंस्ट्रक्टर कोड को स्क्रिप्ट किया जा रहा है।

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (container.FunctionImports.Any())
{
#>
using System.Data.Entity.Core.Objects;
using System.Linq;
<#
}
#>

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
    {
        public <#=code.Escape(container)#>()
            : base("name=<#=container.Name#>")
        {
        base.Configuration.ProxyCreationEnabled = false;
    <#
    if (!loader.IsLazyLoadingEnabled(container))
    {
    #>
            this.Configuration.LazyLoadingEnabled = false;
    <#
    }

मैंने संपत्ति जोड़ दी है base.Configuration.ProxyCreationEnabled = false;ताकि यह कंस्ट्रक्टर में पहली पंक्ति हो।

परिणामी कोड को देखने के लिए अपनी फ़ाइल को सहेजें, और Model1.Context.cs फ़ाइल खोलें। यदि आप टेम्पलेट स्क्रिप्ट को चलाने के लिए बाध्य करना चाहते हैं, तो मेनू का चयन करें

बिल्ड - सभी T4 टेंपरेचर को ट्राँफॉर्म करें

यह जानना आसान है कि क्या आपने अपने T4 कोड में कोई गलती की है, क्योंकि .cs फ़ाइल या तो बिल्कुल भी नहीं बनाई जाएगी, या यदि आप इसे संपादक में खोलते हैं तो स्पष्ट त्रुटियों के साथ।


वाह - यह वास्तव में पसंदीदा समाधान होना चाहिए क्योंकि यह समस्या को जड़ से ठीक करता है। और परिणामी * .cs फ़ाइल के साथ .tt फ़ाइल के संबंध पर भी एक अच्छी पृष्ठभूमि प्रदान करता है।
डगलस टिम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.