कोड प्रथम इकाई ढांचे में विचारों का उपयोग कैसे करें [बंद]


87

मैं पहले इकाई फ्रेमवर्क कोड में डेटाबेस दृश्य का उपयोग कैसे कर सकता हूं,


2
नीचे दिए गए उत्तरों में से कोई भी व्याख्या नहीं करता है कि ईएफ माइग्रेशन का उपयोग करके एक दृश्य कैसे बनाया जाए। इसी तरह के प्रश्न के लिए यह उत्तर देखें ।
रुडी

यहाँ एक ही प्रश्न के साथ एक धागा है। - stackoverflow.com/questions/13593845/…
दिव्य तिवारी

मेरे समाधान की कोशिश करो । यह विचारों के रूप में चिह्नित तालिकाओं के लिए माइग्रेशन जेनरेशन को रोकता है
कोगिया

जवाबों:


95

यदि, मेरी तरह, आप केवल एक अन्य डेटाबेस (मेरे मामले में एक एरपी) से आने वाली मैपिंग इकाई में रुचि रखते हैं, तो उन्हें अपने आवेदन के विशिष्ट संस्थानों से संबंधित करने के लिए, फिर आप एक तालिका का उपयोग करते हुए विचारों का उपयोग कर सकते हैं (नक्शे को देखने में) उसी तरह!)। जाहिर है, यदि आप उस संस्थाओं को अपडेट करने की कोशिश करते हैं, तो आपको एक अपवाद मिलेगा यदि दृश्य अपडेट नहीं है। प्रक्रिया सामान्य के मामले में (तालिका के आधार पर) संस्थाओं के समान है:

  1. दृश्य के लिए एक POCO वर्ग बनाएं; उदाहरण के लिए FooView
  2. DbContext वर्ग में DbSet गुण जोड़ें
  3. व्यू के लिए एक अलग नाम सेट करने के लिए (कंस्ट्रक्टर में टोटेबल ("फू" का उपयोग करके), या विशेष गुणों को सेट करने के लिए एक FooViewConfiguration फ़ाइल का उपयोग करें;

    public class FooViewConfiguration : EntityTypeConfiguration<FooView>      
    {
        public FooViewConfiguration()
        {
            this.HasKey(t => t.Id);
            this.ToTable("myView");
        }
    }
    
  4. मॉडल के लिए FooViewConfiguration फ़ाइल जोड़ें

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new FooViewConfiguration ());
    }
    

64
+1 यह मानने के लिए नहीं कि "कोड फर्स्ट" == ऑटो डेटाबेस पीढ़ी
onetwopunch

3
@DaveJellison क्या आप विस्तृत, या IDatabaseInitializer के भाग के रूप में एक दृश्य जोड़ने पर एक लिंक प्रदान करना चाहते हैं
राल्फ

18
क्या यह सिर्फ मैं है, या हर कोई खाली तालिका बना रहा है? क्या इससे बचने का कोई तरीका है?
क्रीमें लालोवा

4
बस यहाँ सुनिश्चित कर रहा है, क्या यह समाधान हमें बाहरी रूप से पहले से SQL डेटाबेस पर दृश्य बनाने के लिए आवश्यक है? क्या कोड में दृश्य को परिभाषित करना संभव है और क्या यह ऐड-माइग्रेशन / अपडेट-डेटाबेस कमांड के माध्यम से डेटाबेस में पॉप्युलेट होता है?
फ्रॉस्टशोक्स

6
कुछ बातें। 1. यह उत्तर उल्लेख करने में विफल रहता है कि आपको SQL का उपयोग करके मैन्युअल रूप से दृश्य बनाना है, यह एक माइग्रेशन का उपयोग करके किया जा सकता है। 2. यदि वर्ग नाम दृश्य नाम से मेल खाता है, तो आपको दृश्य नाम कॉन्फ़िगर करने की आवश्यकता नहीं है। 3. आप DataAnnotations का उपयोग इस तरह कर सकते हैं: [Table("myView")]यह यकीनन उपयोग करने की तुलना में सरल है EntityTypeConfiguration
रुडी

23

यह एक अद्यतन हो सकता है लेकिन EF कोड के साथ विचारों का उपयोग करने के लिए सबसे पहले कक्षा के शीर्ष पर [टेबल ("NameOfView")] जोड़ें और सभी सही तरीके से काम करें बिना सभी हुप्स के माध्यम से जाने के लिए हर किसी के माध्यम से जा रहा है। इसके अलावा, आपको कॉलम में से एक [कुंजी] कॉलम के रूप में रिपोर्ट करना होगा। इसे लागू करने के लिए नीचे मेरा नमूना कोड दिया गया है।

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace SomeProject.Data
{
    [Table("SomeView")]
    public class SomeView
    {
        [Key]
        public int NameID { get; set; }
        public string Name { get; set; }
    }
}

और यहाँ संदर्भ जैसा दिखता है

using System.Data.Entity;

namespace SomeProject.Data
{
    public class DatabaseContext : DbContext
    {
        public DbSet<SomeView> SomeViews { get; set; }
    }
}

2
यह स्वीकृत उत्तर के समान है, सिवाय इसके कि DataAnnotations का उपयोग करता है जबकि स्वीकृत उत्तर EF द्रव एपीआई का उपयोग करता है।
रुडी

4
वास्तव में यह नहीं है। मैंने कोशिश की, सफलता के बिना, स्वीकार किए गए उत्तर पर और यह मेरे लिए अच्छी तरह से काम नहीं किया। लेकिन तब मैं माइग्रेशन का उपयोग कर रहा हूं इसलिए इससे चीजें प्रभावित हो सकती हैं। मैंने पाया कि मुझे अपना माइग्रेशन पहले करना था, क्योंकि यह पहले से ही डेटाबेस में मौजूद था, तब मैंने अपना व्यू क्लास जोड़ा। यदि हम डेटाबेस में पहले से ही मौजूदा टेबल रखते हैं तो हम इसे ठीक उसी तरह से संभालेंगे। चूँकि एक दृश्य "वर्चुअल टेबल" है इसलिए इकाई फ्रेमवर्क में टेबल सिंटैक्स अभी भी काम करता है।
चार्ल्स ओवेन

11

यदि आप चाहते हैं कि सभी सामान्यीकृत वस्तुओं का एक समूह है, तो हो सकता है कि आपने IQueryable<TDenormolized>अपनी DbContextकक्षा में केवल सार्वजनिक संपत्ति प्राप्त की हो ।

में getआप अपने de-सामान्यीकृत वस्तुओं में de-normoalized मूल्यों परियोजना के लिए एक Linq परिणाम लौटने। यह DB दृश्य लिखने से बेहतर हो सकता है क्योंकि आप प्रोग्रामिंग कर रहे हैं, आप केवल selectबयानों का उपयोग करके सीमित नहीं हैं । इसके अलावा यह समय संकलन सुरक्षित है।

बस सावधान रहना चाहिए ToList()कि कॉल की तरह गणना को ट्रिगर न करें , जो स्थगित क्वेरी को तोड़ देगा और आप डेटाबेस से एक लाख रिकॉर्ड वापस पाने के साथ समाप्त हो सकते हैं और उन्हें अपने एप्लिकेशन सर्वर पर फ़िल्टर कर सकते हैं।

मुझे नहीं पता कि यह सही तरीका है, लेकिन मैंने कोशिश की और यह मेरे लिए काम करता है।


6
मेरे द्वारा उपयोग किए जाने के कारणों में से एक यह है कि EF द्वारा उत्पन्न एसक्यूएल हमेशा 'अच्छा' नहीं होता है - हमारे मॉडल में कुछ विरासत पदानुक्रम हैं (बहुत देर से नुकसान के बारे में पता चला ...) और विचारों का उपयोग करने की अनुमति देता है SQL को मैन्युअल रूप से बनाने के लिए। सिर्फ एक दृष्टिकोण के रूप में क्यों एक दृश्य बेहतर होगा
कार्ल

2
ऐसा नहीं करने का अन्य कारण पुनरावर्ती सामान्य तालिका अभिव्यक्तियों का उपयोग हो सकता है, जो LINQ में उपलब्ध नहीं हैं। लेकिन अन्यथा यह सरल परिदृश्यों के लिए एक अच्छी सलाह है।
टॉम पैजोर्रेक

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

"आप केवल चुनिंदा बयानों का उपयोग करके सीमित नहीं हैं"। इससे तुम्हारा क्या मतलब? LINQ के साथ आप कुछ भी कर सकते हैं, SELECT स्टेटमेंट्स का उपयोग करके किया जा सकता है, वही अन्य तरीके के लिए नहीं कहा जा सकता है।
रुडी

3

मुझे पता है कि यह एक पुराना सवाल है और यहाँ कई उत्तर हैं, लेकिन मैंने इस मुद्दे का उपयोग करने पर एक मुद्दे पर मजबूर किया और जब मैं पैकेज मैनेजर कंसोल में अपडेट-डेटाबेस कमांड का उपयोग करता हूं, तो एक त्रुटि हुई:

डेटाबेस में '...' नाम की एक वस्तु पहले से ही है।

और मैं इस समस्या को हल करने के लिए इन चरणों का उपयोग करता हूं:

  1. पैकेज कमांड कंसोल में इस कमांड को रन करें: ऐड-माइग्रेशन इंटल
  2. माइग्रेशन फ़ोल्डर के अंतर्गत, आप पा सकते हैं ..._ intial.cs फ़ाइल, इसे खोलें और अपनी कक्षा से संबंधित किसी भी कमांड को टिप्पणी दें या हटाएं जिसे आप मैप करना चाहते हैं
  3. अब आप सामान्य रूप से अपने मॉडल में किसी अन्य परिवर्तन के लिए अपडेट-डेटाबेस कमांड का उपयोग कर सकते हैं

आशा करता हूँ की ये काम करेगा।


1
धन्यवाद! यह वास्तव में मदद की! अतिरिक्त के रूप में, ईएफ माइग्रेशन के साथ उत्पन्न कोड हटाने के बजाय, आप इसके बजाय वहां जोड़ सकते हैं migrationBuilder.Sql("CREATE OR REPLACE VIEW ...); ताकि सहकर्मी अपने डेटाबेस को अपग्रेड करने के लिए भी इसका इस्तेमाल कर सकें।
रिच_रिच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.