2012-07-02 13 views
8

मेरे पास कोड प्रथम श्रेणी/तालिका है और फ़ील्ड में से एक प्रकार स्ट्रिंग/nvarchar है। यह स्ट्रिंग MyClass उदाहरण का JSON प्रतिनिधित्व है। मैं केवल MyClass उदाहरणों के साथ कोड में काम करना चाहता हूं, लेकिन इसे डेटाबेस में स्ट्रिंग (JSON) के रूप में संग्रहीत करना चाहता हूं।इकाई फ्रेमवर्क: दृश्य के पीछे JSON कॉलम को क्रमबद्ध/deserialize

public class Message 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string JsonDefinition { get; set; } 
} 

मैं पसंद करते हैं यह इस

public class Message 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Title { get; set; } 
    [JSON] 
    public MyClass JsonDefinition { get; set; } 
} 

कहाँ JSON कस्टम विशेषता जो एफई बताता क्षेत्र MyClass उदाहरण के रूप में धारावाहिक स्ट्रिंग स्टोर करने के लिए है की तरह है: मान लीजिए कि मेरी मेज इस तरह दिखता है चलो । और साथ ही यह ईएफ कहता है: "एक बार जब आप इकाई खींच लेते हैं, तो माइस्क्लास के deserialized उदाहरण के साथ जेसनडिफिनिशन स्ट्रिंग को प्रतिस्थापित करें"

क्या मौजूदा ईएफ 4 तंत्र के साथ हासिल करना संभव है? यदि हां, तो कैसे?

अग्रिम धन्यवाद।

EDIT: MyClass एक शब्दकोश या कोई अन्य जटिल प्रकार हो सकता है।

+0

tis मदद कर सकता है: http://www.reddnet.net/entity-framework-json-column/ –

उत्तर

8

सीधे नहीं। आपकी कक्षा में हमेशा आपकी स्ट्रिंग प्रॉपर्टी मौजूद होगी क्योंकि ईएफ दृढ़ता के लिए इसकी मांग करता है। आप अपनी गैर मैप किए गए MyClass प्रॉपर्टी भी प्राप्त कर सकते हैं लेकिन आपको मैन्युअल रूप से क्रमबद्धरण और deserialization को संभालना होगा और उन गुणों को सिंक में बनाना होगा।

अनुभवहीन समाधान अपने MyClass में INotifyPropertyChanged को लागू करने और यह सुनिश्चित करें कि MyClass मूल्य में या उसके गुण से किसी में हर बदलाव स्ट्रिंग संपत्ति के लिए JSON क्रमबद्धता ट्रिगर किया जाएगा है। यह बेवकूफ समाधान कुछ साधारण समस्याओं के लिए काम करता है लेकिन इस मामले में यह वास्तव में बुरा विचार है क्योंकि यदि आप MyClass संपत्ति असाइन किए गए बहुत से गुणों को संशोधित करते हैं तो इसका बड़ा प्रदर्शन प्रभाव हो सकता है।

एक और तरीका भौतिकरण और परिवर्तनों को बचाने के लिए ईएफ के हुक का उपयोग कर रहा है। आपको ObjectContext.ObjectMaterialized ईवेंट को संभालने की आवश्यकता होगी (DbContextIObjectContextAdapterDbContext द्वारा स्पष्ट रूप से कार्यान्वित DbContext से ObjectContext प्राप्त कर सकते हैं। इस घटना में हैंडलर आप स्ट्रिंग प्रॉपर्टी के मूल्य का उपयोग करेंगे और इसकी सामग्री को MyClass संपत्ति में deserialize करेंगे। आपको DbContext.SaveChanges को ओवरराइड करना होगा, जहां आप सभी Message उदाहरणों को देखेंगे जिन्हें अपडेट किया जाना चाहिए या अपडेट किया जाना चाहिए और वर्तमान मूल्य प्राप्त करने के लिए अपनी MyClass संपत्ति का उपयोग करें और इसे स्ट्रिंग प्रॉपर्टी पर क्रमबद्ध करें।

जो आप खोज रहे हैं वह कुछ जटिल मैपिंग परिदृश्य या मैप किए गए रूपांतरण हैं। ईएफ उनका समर्थन नहीं करता है लेकिन आप Data UserVoice पर मेरे सुझाव के लिए मतदान कर सकते हैं।

+0

एंटीटी के हुक का उपयोग करने के बजाय, क्या आप संपत्ति प्राप्तकर्ता मांग पर क्रमबद्धता कर सकते हैं, और सेटटर deserialization करते हैं और बाकी वस्तु को populate? –

+0

@ केविनकिबलर के पास इनोटिफप्रॉपर्टी चेंज समाधान के समान मुद्दे हैं लेकिन यह काम करेगा। – Casey

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