2013-03-05 11 views
17

के साथ डेटाबेस में डबल [] सरणी को कैसे स्टोर करें, मैं मौजूदा कोड और आर्किटेक्चर डिज़ाइन पर कोई प्रभाव नहीं डालकर एंटिटी फ्रेमवर्क कोड-फर्स्ट का उपयोग करके डेटाबेस में डबल्स की सरणी कैसे संग्रहीत कर सकता हूं?एंटीटी फ्रेमवर्क कोड-प्रथम दृष्टिकोण

मैंने डेटा एनोटेशन और फ्लुएंट एपीआई को देखा है, मैंने डबल सरणी को बाइट्स की एक स्ट्रिंग में कनवर्ट करने और स्टोर को अपने कॉलम में डेटाबेस में बाइट करने के लिए भी माना है।

मैं धाराप्रवाह एपीआई के साथ public double[] Data { get; set; } संपत्ति उपयोग नहीं कर सकते, त्रुटि संदेश मैं तो मिलता है:

प्रकार double[] पैरामीटर के रूप में इसका इस्तेमाल करने के क्रम में गैर-व्यर्थ मूल्य प्रकार होना चाहिए 'टी' ।

कक्षा जहां Data संग्रहीत है डेटाबेस में सफलतापूर्वक संग्रहीत है, और इस वर्ग के रिश्ते। मुझे केवल Data कॉलम गुम है।

+0

डेटा क्या दर्शाता है:

यहाँ जॉफ्रे सर्द के जवाब के ऊपर एक छोटे सुधार किसी भी लम्बाई (untested) की सूची अनुमति देने के लिए है? शायद आर्किटेक्चर को बदलने के बिना सबकुछ काम करने के लिए अपने कोड को ट्विक करने का एक तरीका है। –

+0

या, एक साधारण फिक्स के लिए, क्या आप डेटाबेस में लिखते समय सभी डबल मानों के साथ अल्पविराम से अलग स्ट्रिंग नहीं बना सकते हैं, फिर जब आपको मानों की आवश्यकता होती है तो स्ट्रिंग को पार्स करें? –

+0

@NathanWhite इस अल्पविराम से अलग स्ट्रिंग दृष्टिकोण के साथ जा रहा है वह कुछ है जिसे हम वास्तव में विचार कर रहे हैं। लेकिन हम ईएफ से कुछ और स्वचालित करना चाहते हैं।इसके जवाबों को ध्यान में रखते हुए मुझे बताया गया है कि ईएफ के साथ डेटाबेस में युगल की सरणी स्वचालित रूप से कहने का कोई तरीका नहीं है। सही बात? – jonas

उत्तर

16

आपकी मदद के कारण, आपके इनपुट के लिए धन्यवाद, मैं इसे हल करने का सबसे अच्छा तरीका ट्रैक करने में सक्षम था। कौन सा है:

public string InternalData { get; set; } 
public double[] Data 
{ 
    get 
    { 
     return Array.ConvertAll(InternalData.Split(';'), Double.Parse);     
    } 
    set 
    { 
     _data = value; 
     InternalData = String.Join(";", _data.Select(p => p.ToString()).ToArray()); 
    } 
} 

इन stackoverflow पदों के लिए धन्यवाद: String to Doubles array और Array of Doubles to a String

+1

यदि कोई सोच रहा है, 'आंतरिक डेटा' को सार्वजनिक होना है, या यह डेटाबेस स्कीमा का हिस्सा नहीं होगा। 'डेटा 'विशेषता में' [NotMapped]' जोड़ने का भी एक अच्छा विचार हो सकता है, भले ही यह अनावश्यक है। इससे यह स्पष्ट हो जाता है कि विशेषता डेटाबेस स्कीमा का हिस्सा नहीं है। –

36

आप इस प्रकार का बात कर सकते हैं:

[NotMapped] 
    public double[] Data 
    { 
     get 
     { 
      string[] tab = this.InternalData.Split(','); 
      return new double[] { double.Parse(tab[0]), double.Parse(tab[1]) }; 
     } 
     set 
     { 
      this.InternalData = string.Format("{0},{1}", value[0], value[1]); 
     } 
    } 

    [EditorBrowsable(EditorBrowsableState.Never)] 
    public string InternalData { get; set; } 
5

मैं जानता हूँ कि यह थोड़ा महंगा है, लेकिन आप यहां इस

class Primitive 
{ 
    public int PrimitiveId { get; set; } 
    public double Data { get; set; } 

    [Required] 
    public Reference ReferenceClass { get; set; } 
} 

// This is the class that requires an array of doubles 
class Reference 
{ 
    // Other EF stuff 

    // EF-acceptable reference to an 'array' of doubles 
    public virtual List<Primitive> Data { get; set; } 
} 

यह अब एक इकाई मैप कर देगा कर सकता है ('संदर्भ ') को अपनी प्राथमिक कक्षा की' सूची 'में। यह मूल रूप से SQL डेटाबेस को खुश होने की अनुमति देने के लिए है, और आपको उचित रूप से डेटा की अपनी सूची का उपयोग करने की अनुमति देता है।

यह आपकी आवश्यकताओं के अनुरूप नहीं हो सकता है, लेकिन ईएफ को खुश करने का एक तरीका होगा।

4

यदि आप List<double> का उपयोग करते हैं तो double[] का उपयोग करना बहुत आसान होगा। आपके पास पहले से एक सारणी है जो आपके Data मानों को संग्रहीत करती है। आपके पास शायद कुछ तालिका से तालिका में विदेशी कुंजी है जहां आपके डबल मान संग्रहीत किए जाते हैं। एक और मॉडल बनाएं जो तालिका को प्रतिबिंबित करता है जहां युगल संग्रहित होते हैं और मैपिंग क्लास में विदेशी कुंजी मैपिंग जोड़ते हैं। इस तरह आपको कुछ जटिल पृष्ठभूमि तर्क जोड़ने की आवश्यकता नहीं होगी जो कक्षा संपत्ति में मूल्यों को पुनर्प्राप्त या स्टोर करता है।

1

नाथन व्हाइट सर्वश्रेष्ठ उत्तर है (मेरा वोट मिल गया)।

[NotMapped] 
    public IEnumerable<double> Data 
    { 
     get 
     { 
      var tab = InternalData.Split(','); 
      return tab.Select(double.Parse).AsEnumerable(); 
     } 
     set { InternalData = string.Join(",", value); } 
    } 

    [EditorBrowsable(EditorBrowsableState.Never)] 
    public string InternalData { get; set; } 
संबंधित मुद्दे