2012-01-17 13 views
7

के साथ ओवरराइड इकाई (डीबीएसईटी) मैं कुछ ऐसा करने की कोशिश कर रहा हूं जो अपेक्षाकृत आसान हो, लेकिन मुझे नहीं पता कि इसे कैसे बनाया जाए।इकाई फ्रेमवर्क 4.1 - फ़िल्टर

मेरे पास एक जेनरेटेड एंटिटी है जिसे मैं एक लिंक कहां जोड़कर ओवरराइड करना चाहता हूं।

इसके साथ प्रसंग के लिए आंशिक:

public partial class MyEntities: DbContext 
{ 
    public MyEntities() 
     : base("name=MyEntities") 
    { 
    }  
    public DbSet<Assignee> Assignees { get; set; } 
} 

मैं MyEntities की एक नई आंशिक बना लिया है और निम्नलिखित

public override DbSet<Assignee> Assignees 
{ 
    get 
    { 
     return this.Assignees.Where(z => z.IsActive == true); 
    } 
    set; 
} 

की कोशिश की लेकिन यह एक अस्पष्टता त्रुटि फेंकता है (जो स्पष्ट है)।

मैं यह कैसे पूरा कर सकते हैं?

धन्यवाद

उत्तर

10

अलग-अलग नामों

public partial class MyEntities: DbContext 
{ 
    public MyEntities() 
     : base("name=MyEntities") 
    { 
    } 

    public DbSet<Assignee> AssigneesSet { get; set; } 

    public IQueryable<Assignee> Assignees 
    { 
     get 
     { 
      return AssigneesSet.Where(z => z.IsActive == true); 
     } 
    } 
} 
+0

यह सबसे तार्किक लगता है ... सुनिश्चित नहीं है कि यह काम करने जा रहा है हालांकि ईएफ अभी भी सार्वजनिक डीबीसेट Assignees {get; सेट; } और संदर्भ का आह्वान करते समय इसका उपयोग नहीं किया जाएगा। लेखक? – Fox

+0

@ फॉक्स फिर आप नाम बदल सकते हैं या 'IQueryable ' संपत्ति के लिए एक अलग नाम दे सकते हैं। – Eranga

+0

अच्छा है, यह पूरी तरह से काम करता है।मैंने बस डीबीसीनेट को इंटेलिसेंस डालने के लिए डीबीकॉन्टेक्स्ट से केवल एक संपत्ति का पर्दाफाश करने के लिए संरक्षित किया है;) –

2
public override DbSet<Assignee> Assignees 
{ 
    get 
    { 
     return base.Assignees.Where(z => z.IsActive == true); 
    } 
    set; 
} 

यह आप क्या चाहते हैं?

+0

मैं ऐसा नहीं कर सकता क्योंकि मुझे MyEntities से विरासत में नहीं मिल रहा है ... DbContext से विरासत – Fox

+1

आप जेनरेट कोड से विरासत प्राप्त करने वाले वर्ग को क्यों नहीं बनाते हैं और संपत्ति के व्यवहार को ओवरराइड करते हैं? – linkerro

+0

बहुत अधिक कोड बदलते हैं .. मुझे अपने डीएएल में बहुत सारे कोड बदलना है ... अच्छा विचार हालांकि – Fox

2

आप अपने मॉडल में टेबल मानचित्रण के लिए एक स्थिति को जोड़ने की कोशिश की है के साथ DbSet<Assignee> और IQueryable<Assignee> उजागर प्रयास करें? अपने edmx में इकाई पर राइट क्लिक करें और "टेबल मैपिंग" चुनें। फिर "एक शर्त जोड़ें"। शायद एक और सुरुचिपूर्ण समाधान।

+0

इस दृष्टिकोण के साथ समस्या यह है कि ईएफ आपको मैप किए गए गुणों के लिए फ़िल्टर जोड़ने की अनुमति नहीं देता है। इस उदाहरण में, उसे मैपिंग से IsActive कॉलम को हटाना होगा, जिसका अर्थ है कि ईएफ IsActive फ़ील्ड में परिवर्तनों को सहेज नहीं पाएगा। मैं अपने डेस्क के खिलाफ अपने सिर को चारों ओर घूमने की कोशिश कर रहा हूं, लेकिन इसका कोई फायदा नहीं हुआ। – demius

0

एक अच्छा अभ्यास एक डीएएल फ़ोल्डर में रिपोजिटरी कक्षाएं बनाना है (जिस नाम को आप चाहते हैं उसका उपयोग करें)। फिर वहां फ़िल्टर करें। यहाँ उस के लिए एक माइक्रोसॉफ्ट ट्यूटोरियल है: http://entityframework.codeplex.com/workitem/48

0

मैं जानता हूँ कि इस सुपर है:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

अपनी इच्छानुसार कोई शर्त के आधार पर किया जाता है एफई मानचित्रण शर्त पर डाल करने के लिए संभव नहीं है, यहाँ कारण है पुराने, लेकिन किसी भी मौजूदा नाम को बदलने के बिना, एक और सरल और सुरुचिपूर्ण तरीका, मूल सदस्य को छिपाने के लिए new कीवर्ड का उपयोग कर रहा है, जैसे:

public new IQueryable<Assignee> Assignees 
{ 
    get 
    { 
     return base.Assignees.Where(z => z.IsActive == true); 
    } 
} 

बस किसी भी भविष्य के आगंतुकों के लिए साझा करना चाहता था, उम्मीद है कि यह मदद करता है!

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