2012-02-23 22 views
11

क्या इकाई को केवल पढ़ने के लिए चिह्नित करने का कोई तरीका है और इसके लिए कोई कुंजी निर्दिष्ट नहीं है?इकाई फ्रेमवर्क कोड प्रथम रीडऑनली एंटिटी

+0

कोड पहले कर सकते हैं और केवल पढ़ने के लिए एक तरह से परस्पर अनन्य हैं। जिज्ञासा से बाहर क्यों आप प्राथमिक कुंजी नहीं चाहते हैं? – Brian

+1

एन्टीटी को एक दृश्य में मैप किया गया है और मैं इसे अपडेट/डालना नहीं चाहता हूं, इसके पास कोई भी कुंजी नहीं है। – Otake

+0

ईएफ डिफ़ॉल्ट रूप से विचारों पर अपडेट नहीं करेगा। –

उत्तर

11

कुछ ऐसी चीजें हैं जिन्हें आप कोड फर्स्ट में केवल पढ़ने के लिए लागू कर सकते हैं। जब आप क्वेरी करते हैं तो सबसे पहले AsNoTracking() का उपयोग करना है।

var readOnlyPeople = (from p in context.People 
         where p.LastName == "Smith" 
         select p).AsNoTracking(); 

इस संहिता सबसे पहले बताता है इन संस्थाओं के लिए परिवर्तनों को ट्रैक नहीं करने के लिए, इसलिए जब आप SaveChanges() कोई इन वस्तुओं में किए गए परिवर्तनों फोन कायम की जाएगी।

सीक्रॉन्ड चीज जो आप कर सकते हैं SaveChanges() पर कॉल करने से पहले राज्य को Unchanged पर सेट कर दिया गया है।

context.Entry(person).State = EntityState.Unchanged; 
context.SaveChanges(); 

यह उस इकाई को किए गए किसी भी बदलाव को अनदेखा करने के लिए पहले कोड को बताता है।

जहां तक ​​कोई कुंजी नहीं है, सभी इकाइयों के पास एक कुंजी होना चाहिए। यह आवश्यक रूप से डेटाबेस में प्राथमिक कुंजी के लिए मानचित्र नहीं हो सकता है, लेकिन यह "इकाई सेट के भीतर एक इकाई प्रकार उदाहरण को विशिष्ट रूप से पहचानना चाहिए"।

+2

हाय ब्रिस, आपके सुझाव मेरे लिए आदर्श समाधान नहीं हैं (मैं वास्तव में केवल उस इकाई को केवल पढ़ने के लिए चिह्नित करना चाहता हूं - जो एनएच में मौजूद है) लेकिन मुझे नहीं लगता कि मैं अभी भी ईएफ में एक साफ समाधान के साथ क्या संभव हूं। "सभी संस्थाओं के पास एक कुंजी होना चाहिए", मैं आपके साथ सहमत हूं लेकिन कभी-कभी आपको कुछ विचारों के साथ काम करना पड़ता है और उनके पास कोई कुंजी नहीं होती है और अगर मैं केवल पढ़ने के रूप में एंटीटी को चिह्नित कर सकता हूं तो मुझे एक कुंजी क्यों चाहिए । – Otake

+0

दरअसल आप यहां सुझाए गए आईसीएकेबलएन्टीटी इंटरफ़ेस के समान एक आईरेडऑनली एंटीटी मार्कर इंटरफ़ेस का उपयोग कर सकते हैं (इसमें ब्लॉग पोस्ट भी हैं जो मुझे मूल रूप से कोड मिला, लेकिन मुझे उन्हें नहीं मिला) http://stackoverflow.com/a/ 65 9 3261/34474 कुछ गॉचाचा उनके बीच संबंधों के साथ हैं जिन पर आपको विचार करना चाहिए (यदि कोई दिलचस्पी लेता है तो मुझे बताएं) अंत में हम ब्राइस ने केवल एक स्वचालित तरीके से सुझाव दिया है। – Cohen

+0

यदि आपके विचार में प्राकृतिक कुंजी नहीं है, तो आप EntityFramework की सहायता के लिए एक जोड़ सकते हैं। दृश्य परिभाषा में: चयन \t NEWID() के रूप में [VirtualKey] ... एंटिटी के मानचित्र में: // प्राथमिक कुंजी this.HasKey (टी => t.VirtualKey); – Elton

8

ईएफ 6 में कोड-प्रथम का उपयोग करके, मैंने कुछ इकाइयां बनाईं जो दृश्यों को प्रतिबिंबित करती हैं, जो स्पष्ट रूप से संशोधित या सहेजी नहीं जानी चाहिए। से इकाई को रोकने के लिए बदला जा रहा है, मैं सेट गुण संरक्षित करते थे:

public class TransplantCenterView 
{ 
    public string TransplantsThisYear { get; protected set; } 
} 

इकाई की रूपरेखा अभी भी इस गुण सेट करने में सक्षम है, लेकिन अन्य डेवलपर्स गलती से एक संकलन समय त्रुटि के बिना यह नहीं कर सकते। यह बहुत अच्छा काम करता है, लेकिन ऐसा लगता है कि ट्रैकिंग पूरी तरह से खत्म करने के लिए बेहतर समाधान होगा। reggaeguitar's answer को


धन्यवाद, ऐसा लगता है इस का जवाब नहीं है (यह भी अपने जवाब ऊपर वोट करें यदि निम्न उपयोगी है) है, जो मुझ से मेरी कोड बदलने के लिए अनुमति दी गई है:

public class MyContext : DbContext 
{ 
    public DbSet<TransplantCenterVeiw> TransplantCenterViews {get; set;} 
} 

करने के लिए:

public class MyContext : DbContext 
{ 
    //appears the DbSet is still needed to make Set<Entity>() work 
    protected DbSet<TransplantCenterView> _transplantCenterViews {get; set;} 
    //this .AsNoTracking() disables tracking for our DbSet. 
    public DbQuery<TransplantCenterView> TransplantCenterViews { 
     get { return Set<TransplantCenterView>().AsNoTracking(); } 
    } 
} 

मैं इस के लिए किसी भी पक्ष-विपक्ष के बारे में पता नहीं है, लेकिन अपने मौजूदा कोड किसी भी hitches के बिना काम जारी रखा है, इसलिए एक जीत लगती है।

+0

इकाई पर ट्रैकिंग अक्षम करने के तरीके के लिए मेरा उत्तर देखें। – reggaeguitar

+0

देव _could_ अभी भी MyContext.Set ()। DoAnyThing() को कॉल करें, इसलिए मैं अभी भी आपके 'संरक्षित सेट' समाधान को प्राथमिकता देता हूं। –

1

यदि आप चाहते हैं पूरी इकाई के लिए केवल पढ़ने के लिए जा आप इस

/// Using a dbquery since this is readonly. 
/// </summary> 
public DbQuery<State> States 
{ 
    get 
    { 
    // Don't track changes to query results 
    return Set<State>().AsNoTracking(); 
} 
} 

स्रोत http://www.adamtuliper.com/2012/12/read-only-entities-in-entity-framework.html

+4

DbQuery को DbQuery में बदल दिया गया। ऊपर वर्णित गेटटर को बदल दिया। संकलित। सब अच्छा। हालांकि, जब मैं उस पृष्ठ को निष्पादित करने के लिए जाता हूं जो दृश्य से डेटा लोड करता है तो मुझे रनटाइम त्रुटि मिलती है: "इकाई प्रकार 'MyEntityName' वर्तमान संदर्भ के लिए मॉडल का हिस्सा नहीं है।" तो, जोड़ा 'सुरक्षित डीबीसेट _hiddenMyEntitiesName {get; सेट;} 'और फिर चीजें काम किया। डीबीसेट <> को ऊपर दिए गए कोड में जोड़ने के लिए सार्थक होगा ताकि लोग एक ही भ्रम में भाग न सकें ... या यदि कोई और तरीका है? लेकिन मुझे सही रास्ते पर रखने के लिए धन्यवाद। –

+0

दिलचस्प, मुझे यह त्रुटि नहीं मिली। मैं टेबल पर मैपिंग कर रहा हूं और विचार नहीं, शायद यह अंतर है? – reggaeguitar

+0

हम्म ... तो, आपके पास अपने संदर्भ में कहीं भी डीबीसेट संपत्ति नहीं है, और यह अभी भी काम करता है? अजीब ... एक संस्करण मुद्दा भी हो सकता है। मैं वीएस 2015 और ईएफ 6 पर वापस आ गया हूं। –

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