7

उदाहरण: मान लें कि मेरे पास ये तीन वर्ग हैं। Foo एक डीबीसेट के साथ एक उचित इकाई फ्रेमवर्क इकाई है जबकि मैं चाहता हूं कि मेरा ईएफ डीबीकॉन्टेक्स्ट Bar और Baz से अनजान हो क्योंकि मैंने अपने बने SerializedColumn विशेषता के साथ फू की बार संपत्ति को ध्वजांकित किया है। उस विशेषता को लागू करके, मैं चाहता हूं कि ईएफ बार के उदाहरण को अपने बाज़ के साथ एक स्ट्रिंग फ़ील्ड में क्रमबद्ध करने के लिए, और पारिवारिक रूप से बार ऑब्जेक्ट को बार-बार deserialize करें जब Foo को EF द्वारा भौतिक रूप से पूरा किया जाता है।इकाई फ्रेमवर्क 6.1 कोड के साथ धारावाहिक इकाई संपत्ति को स्थायी और पुनर्प्राप्त करना पहले

public class Foo 
{ 
    public Guid Id { get; set; } 
    [SerializedColumn] 
    public Bar Bar { get; set; } 
    // .. 
} 

public class Bar 
{ 
    public string Name { get; set; } 
    public Baz[] Baz { get; set; } 
    // .. 
} 

public class Baz 
{ 
    public string Name { get; set; } 
    // .. 
} 

तो फू की तालिका स्तंभ दिखाई देगा:

[Id] [uniqueidentifier] NOT NULL 
[Bar] [nvarchar](max) NULL 

और जब मैं एक Foo क्वेरी मैं Bar संपत्ति पहले से ही deserialized के साथ वापस एक हो। जब मैं FooBar संपत्ति को सम्मिलित या अद्यतन करता हूं तो मुझे इसके बारे में सोचना बिना ईएफ द्वारा क्रमबद्ध किया जाता है। मुझे केवल एक चीज है जो [SerializeColumn] गुणों में विशेषता है।

लक्ष्य:

  • मैं जरूरी एक पूर्ण विकसित समाधान के लिए नहीं देख रहा हूँ (हालांकि मैं इसे स्वीकार करेंगे), लेकिन जहां एफई की पाइप लाइन में कूदने के लिए पर मार्गदर्शन, और कब कि क्या करना है। अर्थात। ईएफ कक्षाओं, विन्यास, सम्मेलन, आदि क्या मुझे ध्यान में रखना चाहिए?
  • मैं चाहता हूं कि माइग्रेशन जेनरेट हो जाएं जैसा कि कोई उम्मीद करेगा। जो कहना है, मैं नहीं चाहता कि मेरी Bar संपत्ति "बार_आईडी" फ़ील्ड में बदल जाए जो "बार" तालिका को इंगित करे। इसके बजाय मुझे nvarchar(max) "बार" फ़ील्ड चाहिए जिसमें Bar ऑब्जेक्ट का क्रमबद्ध संस्करण होगा। यदि यह संभव नहीं है, तो कृपया अपने उत्तर में ऐसा कहें।

नोट्स:

  • इस के लिए विचार रोवन मिलर द्वारा Building Applications with Entity Framework 6 वीडियो को देखने के बाद आया था।
  • ComplexType मेरी ज़रूरतों को पूरा नहीं करता है। मुझे गहरी धारावाहिकता की आवश्यकता है और धारावाहिक के किसी भी गुण को फ़िल्टर या सॉर्ट करने में सक्षम होने की आवश्यकता नहीं है।
  • मैं न्यूटॉन्सॉफ्ट की जेएसओएन लाइब्रेरी के साथ क्रमबद्ध करने की योजना बना रहा हूं, लेकिन सीरियलाइजेशन कैसे होता है वास्तव में कोई फर्क नहीं पड़ता।
+0

कुछ इस तरह अपडेट किया गया? http://stackoverflow.com/questions/14779740/can-i-embed-an-object-in-an-ef-entity-serialize-on-save-deserialize-on-access – MutantNinjaCodeMonkey

+0

@MutantNinjaCodeMonkey मैंने इसे किया है अतीत और यह काम करता है, लेकिन दृढ़ता पूरी तरह से पारदर्शी बनाने के लिए देख रहा हूँ। मेरे द्वारा बनाई गई 'SerializeColumnAttribute' के साथ केवल एक ही संपत्ति' बार 'है, और कोई' BarSerialized' प्रॉपर्टी नहीं है। –

+2

बहुत यकीन है कि यह ईएफ 6 में संभव नहीं है। आपको वास्तव में क्या चाहिए एक ग्राहक प्रकार कनवर्टर है।यह सुविधा ईएफ 7 के लिए [नियोजित] (https://github.com/aspnet/EntityFramework/issues/242) है लेकिन अभी तक कार्यान्वित नहीं है। – DavidG

उत्तर

9

एकमात्र समाधान यह है,

public class Foo 
{ 
    public Guid Id { get; set; } 

    // Not Mapped attribute will make EF 
    // ignore this property completely 
    [NotMapped] 
    public Bar BarObject { 
     get; 
     set; 
    } 

    public string Bar{ 
     get{ 
      return JsonConvert.Serialize(BarObject); 
     } 
     set{ 
      BarObject = JsonConvert.Deserialize<BarObject>(value); 
     } 
    } 
} 

प्रति सुझाव के रूप में @zds द्वारा

+0

धन्यवाद आकाश लेकिन मैंने @ बुबी को बक्षीस दिया क्योंकि उसने पहले ही आपके जैसा जवाब दिया था, हालांकि थोड़ा कम विस्तृत। अगर मैं कर सकता, तो मैं दोनों उत्तरों के बीच बक्षीस को विभाजित करता। –

+1

धारावाहिक तर्क को 'सार्वजनिक स्ट्रिंग बार' संपत्ति में स्थानांतरित करना बेहतर हो सकता है। कुछ बदलते समय, हर समय क्रमबद्ध और deserialize नहीं है। या क्या मैं कुछ न कुछ भूल रहा हूं? – zds

1

ईएफ संशोधित किए बिना इसे करने का कोई तरीका नहीं है। ईएफ 6 के साथ मुझे लगता है कि कई लोगों ने इसे टेक्स्ट बैकिंग फील्ड और कुछ सीमाओं के साथ किया है (बार और बार बच्चे ईएफ निरंतर संपत्ति तक नहीं पहुंचते हैं या आपको deserialization के बाद अन्य काम की ज़रूरत है)।

+0

मैं डेटाबेस में टेक्स्ट बैकिंग फ़ील्ड (कोई फ़िल्टरिंग, इन-डेटाबेस अनुमान, इत्यादि) के साथ आने वाली सीमाओं के साथ ठीक हूं। या टेक्स्ट बैकिंग फ़ील्ड द्वारा आप दो गुणों का उपयोग करने का जिक्र कर रहे हैं, एक चिह्नित [नोटमैप] जो कि एन्क्रिप्टेड संपत्ति का इन-मेमोरी, डिक्रिप्टेड संस्करण है जो ईएफ जारी रहेगा? –

+0

बैकिंग फ़ील्ड के लिए मेरा मतलब है दो गुण, एक चिह्नित [NotMapped] जो एन्क्रिप्टेड संपत्ति का इन-मेमोरी, डिक्रिप्टेड संस्करण है जो ईएफ जारी रहेगा। – bubi

+0

ठीक है, बैकिंग गुणों के साथ कुछ भी गलत नहीं है अगर ऐसा ही आता है। धन्यवाद @ बुबी मैं यह बक्षीस थोड़ी देर के लिए देखने के लिए जा रहा हूं यह देखने के लिए कि कोई और कुछ उपयोगी जानकारी जोड़ सकता है या नहीं। –

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