2011-07-20 27 views
6

मैं ईएफ 4.1 के साथ एमवीसी 3 वीएस -2010 का उपयोग कर रहा हूं, मैंने SQL सर्वर का उपयोग करके अपना डीबी बनाया है और मैं इसे एमवीसी 3 वेब एप्लिकेशन में आयात करता हूं।डाटाबेस से डाटाबेस अपडेट करें (डाटाबेस फर्स्ट)

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

क्या मॉडलों की जानकारी खोए बिना डाटाबेस से मॉडल अपडेट करने के लिए वैसे भी है?

या

जहाँ मैं मॉडल 'फ़ाइलों को सीधे उपयोग करने के बजाय अपने मॉडल पर मान्यता परिभाषित करना चाहिए?

उत्तर

10

अद्यतन: चूंकि यह अभी भी अपेक्षाकृत लोकप्रिय है, मैंने इस पर एक ब्लॉग पोस्ट बनाया है।

http://jnye.co/Posts/19/adding-validation-to-models-created-by-entity-framework-database-first-c

आप अपने मॉडल को मान्य है, और नहीं ViewModels का उपयोग करना चाहते हैं, तो आंशिक वर्गों का उपयोग सत्यापन विशेषताओं को परिभाषित करने के। उदाहरण के लिए:

कहो आप

public class User { 
    public string Name { get; set; } 
} 

यदि आप उस पर एक स्ट्रिंग की लंबाई सत्यापनकर्ता डाल करने के लिए आप एक आंशिक वर्ग बनाने के लिए की आवश्यकता होगी और उपयोग MetadataTypeAttribute (इस System.ComponentModel में रहती है चाहता था की तरह एक मॉडल है .DataAnnotations)

निम्नलिखित कक्षाएं, नहीं एक ही फाइल में डाल के रूप में अपने ऑटो मॉडल उत्पन्न अपनी अलग फाइल में परिभाषित किया जाना चाहिए।

[MetadataTypeAttribute(typeof(UserMetadata))] 
public partial class User { 
} 

फिर आप इस प्रकार UserMetadata कक्षा में अपने मान्यता को परिभाषित

public class UserMetadata{ 
    [StringLength(50)] 
    public string Name {get; set;} 
} 

संपादित

मैं सिर्फ इस लेख जो थोड़ा और विस्तार में समाधान बताते पाया http://themonitoringguy.com/tips-tricks/validating-microsoft-entity-framework-objects-c-mvc/

+0

इसलिए हर बार मॉडल पुनर्जीवित मैं प्रत्येक फ़ाइल के लिए वापस जाने के लिए और मेरी [MetadataTypeAttribute (typeof()] विशेषता को फिर से परिभाषित करने के लिए है। आप @NinjaNye धन्यवाद, लेकिन यह मेरे लिए व्यावहारिक नहीं है। – Shadi

+0

नहीं, आप केवल होगा किसी नई संपत्ति के लिए सत्यापन को परिभाषित करने की आवश्यकता है, जिसे आपको वैसे भी करना होगा। आंशिक वर्ग और मेटाडेटा कक्षा को अधिलेखित नहीं किया जाएगा या – NinjaNye

+0

प्रतिस्थापित नहीं किया जाएगा क्षमा करें, मुझे यह थोड़ा स्पष्ट बनाना चाहिए था, अपनी आंशिक कक्षा और मेटाडेटा कक्षा को अलग से परिभाषित करना चाहिए था फ़ाइल, ऑटो जेनरेट की गई फ़ाइल में नहीं। मैं अपना उत्तर – NinjaNye

1

किसी भी डिजाइनर का पहला नियम है: यह यह किसी भी कोड आप इसे संशोधित नहीं कर सकते, क्योंकि यह पूरी तरह से अगली बार जब आप डिजाइनर में कुछ भी अद्यतन को हटा दिया जाएगा उत्पन्न करता है।

सभी उत्पन्न वर्गों आंशिक हैं ताकि आप अपने आंशिक हिस्सा बना सकते हैं और वहाँ अपने कस्टम तर्क रख सकते हैं। आप स्पष्ट रूप से ऑटो जेनरेट किए गए भाग में परिभाषित गुणों में विशेषताओं को जोड़ नहीं सकते हैं। डेटा एनोटेशन के मामले में या तो buddy classes या कस्टम टी 4 टेम्पलेट के माध्यम से संभव है कि कोड जनरेशन के दौरान कौन सा डेटा एनोटेशन जोड़ा जाना चाहिए, यह तय करने के लिए अपना तर्क होगा। दोनों परिदृश्यों को अधिकतर खराब अभ्यास के रूप में माना जाता है क्योंकि आपके पास उस दृश्य के लिए आवश्यक सत्यापन के साथ प्रति दृश्य अलग दृश्य मॉडल होना चाहिए।

2

नहीं, फ़ाइलों को हर बार पुनर्जीवित किया जाएगा। ताकि आप आसानी से MetadataTypeAttribute का उपयोग कर DataAnnotations जोड़ सकते हैं

सभी वर्गों आंशिक रूप में परिभाषित किया जाता है।

मान लीजिए कि आप एक User वर्ग के रूप में परिभाषित किया गया है का पालन करते हैं:

public partial class User { 
    public string Name {get;set;} 
} 

एक IUser इंटरफ़ेस बनाएँ

public interface IUser { 
    [Required] 
    [DisplayName("User name")] 
    string Name {get;set;} 
} 

और फिर कि IUser मेटाडाटा के रूप में उपयोग किया जाएगा निर्दिष्ट करने के लिए User वर्ग का विस्तार।

[MetadataType(typeof(IUser))] 
public partial class User {} //Empty class body 
+0

धन्यवाद बर्टंड, आप और @ निंजाए एक बड़ी मदद प्रदान की है। – Shadi

+0

मेटाडाटा टाइप यहां इंटरफ़ेस का विस्तार करने के लिए ':' कीवर्ड का उपयोग करने से अलग है? –

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