एंटिटी फ्रेमवर्क कोड फर्स्ट CTP 5 का उपयोग करके चित्रों को कैसे स्टोर करें?


83

मैं केवल यह पता लगाने की कोशिश कर रहा हूं कि क्या ईएफ कोड फर्स्ट सीटीपी 5 का उपयोग करके बाइनरी (फाइल) डेटा को स्टोर करने और पुनर्प्राप्त करने का एक सरल तरीका है? मैं वास्तव में इसे FILESTREAM प्रकार का उपयोग करना पसंद करूंगा, लेकिन मैं वास्तव में इसे काम करने के लिए किसी तरह की तलाश कर रहा हूं।

जवाबों:


41

आप FILESTREAMEF में SQL का उपयोग नहीं कर सकते । EF को अलग-अलग डेटाबेस सर्वरों के शीर्ष पर काम करने वाला माना जाता है, लेकिन filestream फीचर SQL 2008 और नए की विशिष्ट विशेषता है। आप इसे पुराने तरीके से करने का प्रयास कर सकते हैं - varbinary(max)अपने डेटाबेस तालिका में उपयोग करें और अपने मैप किए गए वर्ग में बाइट सरणी का उपयोग करें।

संपादित करें:

थोड़ा स्पष्टीकरण - आप FILESTREAMडेटाबेस में उपयोग कर सकते हैं लेकिन ईएफ स्ट्रीमिंग का लाभ नहीं लेगा। यह इसे मानक के रूप में लोड करेगा varbinary(max)


112

मैं हमेशा ProductImageआलसी लोडिंग को प्रबंधित करने और टेबल को सामान्य करने के लिए एक-से-एक एसोसिएशन के साथ एक और वर्ग बनाता हूं :

public class ProductImage
{
    public int ProductId { get; private set; }
    public byte[] Image { get; set; }
}

4
क्या ऐसा दृश्य बनाना अधिक सरल नहीं होगा, जिसमें फ़ाइल छवि स्तंभ शामिल नहीं है और फिर EF में दूसरी इकाई बनाएँ जो तालिका के बजाय दृश्य को इंगित करता है - जैसे, "ProductLite"
C.List

@ C.List मैं विश्वास नहीं कर सकता कि मैं वर्षों से EF का उपयोग कर रहा हूं और ऐसा करने के बारे में कभी नहीं सोचा था। यह एक शानदार विचार है और मैंने इसे केवल उपयोग करने के लिए रखा है, एक अनावश्यक दृश्य से छुटकारा पा रहा हूं जो मैं एक ही काम करने के लिए उपयोग कर रहा था। चलो इसे एक "आभासी इकाई" कहते हैं :)
ग्रेग गम

65

बस अपनी संपत्ति को बाइट के रूप में घोषित करें [] जैसा कि लदिस्लाव ने उल्लेख किया है।

public class Product
{
    public int Id { get; private set; }

    public string Name { get; set; }

    public byte[] ProductImage { get; set; }
}

बिल्कुल यही बात है। यदि आप उस संपत्ति को मैप नहीं करते हैं जो कन्वेंशन है तो यह मैप्स ए है varbinary(max)। यदि आपके पास डेटाबेस में एक छवि स्तंभ पहले से ही सिर्फ [Column(TypeName = "image")]ProductImage संपत्ति में जोड़ें या यदि आप कोड मैपिंग पसंद करते हैं, तो इसे संदर्भ श्रेणी में अपने OnModelCreating ओवरराइड में जोड़ें:

modelBuilder.Entity<Product>().Property(p => p.ProductImage).HasColumnType("image");

मेरे पास जो समस्या है, वह यह है कि मुझे संपत्ति को आलसी बनाने का कोई तरीका नहीं मिला है क्योंकि मैं जरूरी नहीं कि किसी उत्पाद को लाने पर हर बार बाइनरी डेटा लोड करना चाहता हूं। मुझे यकीन नहीं है कि मैं सही ढंग से याद करता हूं लेकिन NHibernate इसे बॉक्स से बाहर कर सकता है।


हां, NHibernate कॉलम-विशिष्ट आलसी-लोडिंग बॉक्स से बाहर कर सकता है: ayende.com/blog/4377/nhibernate-new-feature-lazy-properties
gabe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.