2012-12-27 15 views
23

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

Getting Started with Entity Framework 6 Code First using MVC 5

मैं किसी मौजूदा SQL डेटाबेस है, और मुझे ADO.NET Enity डेटा मॉडल का उपयोग कर रहा मॉडल के लिए। मैं अपने एमवीसी अनुप्रयोग में कुछ सीआरयूडी सुविधाओं का निर्माण करने की कोशिश कर रहा हूं।

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

[Required] 
    [StringLength(10)] 
    public string Name { get; set; } 

हालांकि, मॉडल वर्गों स्वत: जनरेट होते हैं, इसलिए मुझे लगता है कि उसमें बदलाव करने एक बुरा विचार है (और वैसे भी लिखा हो जाएगी यदि डेटाबेस मॉडल ताजा है)।

मैं सत्यापन गुण कैसे जोड़ूं?

+1

आपको दृश्य पर डेटा एनोटेशन डालना चाहिए मॉडल गुण –

+0

अब इसके बारे में पढ़ना, धन्यवाद। – Mason240

+0

http://stackoverflow.com/a/16737247/900284 यह दिखाता है कि इसे कैसे बनाएं –

उत्तर

34

आप एक आंशिक वर्ग बना सकते हैं एफई उत्पन्न वर्ग से अलग, में मेटाडाटा स्टोर करने के लिए

//Contact.cs - The original auto-generated file 
[System.ComponentModel.DataAnnotations.MetadataType(typeof(ContactMetadata))] 
public partial class Contact 
{ 
    public int ContactID { get; set; } 
    public string ContactName { get; set; } 
    public string ContactCell { get; set; } 
} 

//ContactMetadata.cs - New, seperate class 

using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
internal sealed class ContactMetadata 
{ 
    [Required(ErrorMessage = "Name is required.")] 
    [StringLength(5)] 
    public string ContactName; 
} 
+14

वास्तव में आपको मूल ऑटो-जेनरेट की गई फ़ाइल को संशोधित करने का प्रयास नहीं करना चाहिए, केवल एक और फ़ाइल बनाएं क्योंकि ** आंशिक ** कीवर्ड इसे बनाएगा एक आकर्षण की तरह काम करते हैं। –

+0

ओह हाँ, मैं सहमत हूं। मेरे पास प्रत्येक वर्ग अपनी फ़ाइल में एक अलग मेटाडेटा फ़ोल्डर में है। – Mason240

+1

कंपाइलर चेतावनियां उत्पन्न करता है जो कहता है कि ContactName "कभी असाइन नहीं किया गया है, और हमेशा इसका डिफ़ॉल्ट मान शून्य होगा"; क्या यह डिफ़ॉल्ट गुणों के लिए सुरक्षित है? – Brad

17

Mason240 जवाब अच्छी तरह से काम करता है, मैं इसे सुधारने की कोशिश करेंगे:। आप एक नया ContactDataAnnotations बना सकते हैं। सीएस वर्ग के साथ: - जिस तरह से और बिना किसी चेतावनी के,

//ContactDataAnnotations.cs - A new file 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 

[MetadataType(typeof(ContactMetadata))] 
public partial class Contact 
{ 
    // No field here 
} 

internal sealed class ContactMetadata 
{ 
    [Required(ErrorMessage = "Name is required.")] 
    [StringLength(5)] 
    public string ContactName {get; set; } 
} 

इस तरह, आप एफई के माध्यम से अपने संपर्क वर्ग DataAnnotations बिना छुए को पुनर्जीवित कर सकते हैं।

+0

यह जादू की तरह काम करता है। –

4

यह पहले से ही सही ढंग से उत्तर दिया गया है, लेकिन मैं यह भी जोड़ना चाहता था कि मुझे हमेशा मेटाडाटा घोंसला मिल जाए, मेरे लिए थोड़ा क्लीनर लग रहा था, IMHO।

[MetadataType(typeof(ProductDescription.Metadata))] 
public partial class ProductDescription 
{ 
    sealed class Metadata 
    { 
     [Key] 
     public long id { get; set; } 
     [Display(Name = "Title")] 
     public string title { get; set; } 
     // ... 
    } 
} 

मैंने मेटाडाटा को कक्षा में निजी रखने का एक अतिरिक्त लाभ भी देखा। विशेषता केवल सही वर्ग पर काम करेगी, अगर आप कक्षा को डुप्लिकेट कर सकते हैं (एक समान बनाने के लिए) हो सकता है कि एक बग को रोकें। यदि आप डुप्लिकेट क्लास का नाम बदलते समय विशेषता में वर्ग का नाम बदलना भूल जाते हैं तो बग हो सकता है।

4

मुझे पता है कि यह उत्तर दिया गया है लेकिन मैं कुछ सामान साफ़ करना चाहता हूं।

@SteveCav ने कहा: "इस सदस्य को एक से अधिक बार परिभाषित किया गया है"। मुझे वही वही त्रुटि थी। पता लगाने की कोशिश कर रहे घंटे बिताए।

अंततः इसे ठीक करने के लिए, आपको एक ही विधानसभा में एक अलग फ़ाइल कक्षा बनाना है (मुझे लगता है कि यह पहले से ही उल्लेख किया गया है)। लेकिन मैं जो तनाव देना चाहता हूं वह यह है कि इस वर्ग को आंशिक कक्षा का प्रतिनिधित्व करने वाले आंशिक वर्ग के साथ घोंसला होना चाहिए।

और फिर आप उस आंतरिक वर्ग को एनोटेशन कक्षा के साथ सजाते हैं। इस तरह:

//ContactMap.cs - Present in the same namespace as Contact.cs 
[System.ComponentModel.DataAnnotations.MetadataType(typeof(ContactMap))] 
partial class Contact // Present in the ContactMap class. This represent the Inner Class 
{ 
} 

//ContactMap.cs - This represent the outer class 

using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
public class ContactMetadata 
{ 
    [Required(ErrorMessage = "Name is required.")] 
    [StringLength(5)] 
    public string ContactName; 
} 

आशा है कि यह स्पष्ट या अधिक समझदार है।

3

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

संक्षेप में: मॉडल वर्ग से उत्तराधिकारी और विरासत वर्ग पर मेटाडेटा जोड़ें। एक अतिरिक्त लाभ यह है कि स्वैगर कोडेजन के साथ आप सीधे मैपिंग के बिना एपीआई मॉडल का उपयोग कर सकते हैं और प्रारंभिक रूपों के लिए आप संरक्षित डिफ़ॉल्ट सीटीआर का उपयोग कर सकते हैं।

[MetadataType(typeof(LocalAssemblyModelMetadata))] 
public class LocalAssemblyModel : IO.Swagger.Model.OtherAssemblyModel 
{ 
    public LocalAssemblyModel() : base()  { } 
} 



public sealed class LocalAssemblyModelMetadata 
{ 
    [Required(ErrorMessage = "BaseclassProperty is mandatory.")] 
    public string BaseclassProperty { get; set; } 
} 
संबंधित मुद्दे