2012-05-03 10 views
5

मुझे दिलचस्पी है कि मैं कोड का उपयोग करके दो इकाइयों को उसी तालिका में कैसे मैप कर सकता हूं। यहां एक उदाहरण दिया गया है:ईएफ कोड एक ही टेबल पर पहली एकाधिक इकाइयां

public class User 
{ 
    [Key] 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public byte Age { get; set; } 
    public bool Active { get; set; } 
    public DateTime Created { get; set; } 
} 

public class UserViewModel 
{ 
    [Key] 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public byte Age { get; set; } 
} 

असल में मैं रिपोजिटरी के निर्माण से तंग आ गया हूं। मैं मॉड्यूलबिल्डर में कॉन्फ़िगरेशन पोर्टल, उपयोगकर्ता पोर्टल, अन्य सेवाओं के लिए सभी संभावित मॉडल मैप करना चाहता हूं और बस सबकुछ के लिए डीबीकॉन्टेक्स्ट का उपयोग करना चाहता हूं। मैं उपयोगकर्ता श्रेणी को पदानुक्रम के शीर्ष के रूप में सेट करना चाहता हूं और एक वर्ग जो डेटाबेस बनाता है, जबकि अन्य सभी मॉडलों को विभिन्न अनुप्रयोगों के लिए होना चाहिए।

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

मैं modelbuilder में इस का उपयोग करने की कोशिश की है, लेकिन यह मुझे चेतावनी दी है कि पदानुक्रम मान्य नहीं है:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>().Map(p => { p.ToTable("Users"); }); 
     modelBuilder.Entity<UserViewModel>().Map(p => { p.ToTable("Users"); }); 
    } 

यह भी ध्यान है कि मैं "तालिका बंटवारे" हासिल करने की कोशिश नहीं कर रहा हूँ में रहते हैं। मैं नहीं चाहता कि मेरी तालिका दो इकाइयों में विभाजित हो, मैं चाहता हूं कि सभी कॉलम नलिकाएं हों, प्राथमिक कुंजी के साथ एक को छोड़कर, और विभिन्न एप्लिकेशन/वेब सेवाओं/वेब पोर्टलों को जितना डेटा दिया गया उतना डेटा पॉप्युलेट करने की अनुमति दें के लिए उपयोग

सभी युक्तियों के लिए धन्यवाद :)

+0

सामान्य भंडार पैटर्न पर एक नजर डालें। आपको अपनी सभी संस्थाओं के लिए एक ही आधार भंडार की आवश्यकता है। मुझे तुम्हारा दर्द महसूस होता है, जब तक मैंने जेनेरिक रिपोजिटरी पैटर्न की खोज नहीं की, तब तक मैंने प्रत्येक इकाई के लिए एक भंडार तैयार किया। – JBeckton

उत्तर

9

आप नहीं कर सकते। एक तालिका = एक इकाई (उन्नत मैपिंग को छोड़कर जैसे तालिका विभाजन और टीपीएच विरासत)। मॉडल देखें और इकाई नहीं है। यह डेटा/प्रक्षेपण पर सिर्फ दृश्य है इसलिए इसे इस तरह से संभाल लें। तुम हमेशा उपयोगकर्ता और परियोजना उपयोगकर्ता के साथ काम करेंगे मॉडल देखने पर आप की जरूरत:

var view = from u in context.Users 
      select new UserViewModel 
       { 
        UserId = u.UserId, 
        Name = u.Name, 
        Age = u.Age 
       }; 

IQueryable<UserViewModel> लौटने इस के रूप में पुन: प्रयोज्य विधि बनाएं और आप जो चाहे कर सकते हैं। कोड के साथ इकाई ढांचे में

+0

मैं पहले प्रक्षेपण कर रहा था, लेकिन पुन: प्रयोज्य विधि के साथ नहीं। आपके विचार दोनों ने मेरी मदद की + मेरा कोड अब और अधिक सुरुचिपूर्ण दिखता है। धन्यवाद! –

+1

डेटाबेस अभी भी अनावश्यक डेटा देता है हालांकि शानदार नहीं है। मैं इस विधि का उपयोग कर एक प्रश्न से कुछ वर्कर (अधिकतम) एस को हटाने की उम्मीद कर रहा था लेकिन यह अभी भी वह डेटा लौटाता है और वेब ऐप – BritishDeveloper

+0

में गुणों को हटा देता है जो इस परिदृश्य के लिए ठीक है लेकिन प्रदर्शन के बारे में चिंतित अन्य लोगों को चेतावनी देता है – BritishDeveloper

1

तालिका के अनुसार पदानुक्रम TPH विरासत पहले

https://www.youtube.com/watch?v=2i7jahkpeQ8&list=PL6n9fhu94yhUPBSX-E2aJCnCR3-_6zBZx&index=19

+0

के बजाय Func <,> टाइप करें, जबकि यह लिंक प्रश्न का उत्तर दे सकता है, यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। –