2011-01-11 10 views
70

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

उत्तर

37

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

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

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

52

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

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

    public string Name { get; set; } 

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

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

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

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

+0

हाँ, NHibernate स्तंभ विशेष आलसी लोडिंग कर सकते हैं बॉक्स के बाहर: http://ayende.com/blog/4377/nhibernate-new-feature-lazy-properties। – gabe

95

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

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

मैंने इस तकनीक का उपयोग करके एक प्रमुख प्रदर्शन वृद्धि देखी। – jsturtevant

+2

क्या ऐसा दृश्य बनाने के लिए यह बहुत आसान नहीं होगा जिसमें फ़ाइल छवि कॉलम शामिल न हो और फिर ईएफ में दूसरी इकाई बनाएं जो तालिका के बजाय दृश्य को इंगित करे - कहें, उदा। "ProductLite" –

+0

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

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