इकाई रूपरेखा द्वारा उत्पन्न वर्ग में डेटा एनोटेशन जोड़ें


93

मेरे पास इकाई ढांचे द्वारा उत्पन्न निम्न वर्ग है:

public partial class ItemRequest
{
    public int RequestId { get; set; }
    //...

मैं इसे एक आवश्यक क्षेत्र बनाना चाहूंगा

[Required]
public int RequestId { get;set; }

हालाँकि, क्योंकि यह जेनरेट किया गया कोड है, यह मिटा दिया जाएगा। मैं एक आंशिक वर्ग बनाने के तरीके की कल्पना नहीं कर सकता क्योंकि संपत्ति उत्पन्न आंशिक वर्ग द्वारा परिभाषित की गई है। मैं एक सुरक्षित तरीके से बाधा को कैसे परिभाषित कर सकता हूं?


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

@KirillBestemyanov - @ Html.ValidationMessageFor (model => model.Item.Item.ResourceTypeID) ग्राहक पक्ष को विफल करना चाहिए। ऐसा नहीं होता।
पी। ब्रायन। मैके

जवाबों:


143

उत्पन्न वर्ग ItemRequestहमेशा एक partialवर्ग होगा। यह आपको एक दूसरा आंशिक वर्ग लिखने की अनुमति देता है जो आवश्यक डेटा एनोटेशन के साथ चिह्नित है। आपके मामले में आंशिक वर्ग ItemRequestइस तरह दिखेगा:

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

//make sure the namespace is equal to the other partial class ItemRequest
namespace MvcApplication1.Models 
{
    [MetadataType(typeof(ItemRequestMetaData))]
    public partial class ItemRequest
    {
    }

    public class ItemRequestMetaData
    {
        [Required]
        public int RequestId {get;set;}

        //...
    }
}

11
आंशिक वर्ग का उत्थान नहीं होगा। यही कारण है कि इसे आंशिक के रूप में परिभाषित किया गया है।
MUG4N

क्या आपको आंशिक संशोधक याद आया? क्या आप एक ही नामस्थान का उपयोग करते हैं?
MUG4N

3
.NET कोर उपयोगकर्ता: मेटाडेटा टाइप के बजाय ModelMetadataType का उपयोग करें।
बॉब कॉफमैन

1
आप आंशिक वर्ग को तब तक रख सकते हैं, जब तक आप नाम स्थान के समान हों
MUG4N

40

MUG4N ने उत्तर दिया कि आप उपयोग कर सकते हैं आंशिक कक्षाओं का लेकिन इसके बजाय बेहतर उपयोग इंटरफेस होगा। यदि EF मॉडल सत्यापन मॉडल के अनुरूप नहीं है तो इस मामले में आपके पास संकलन त्रुटियाँ होंगी। तो आप अपने ईएफ मॉडल को बिना किसी डर के संशोधित कर सकते हैं कि सत्यापन नियम पुराने हैं।

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace YourApplication.Models
{
    public interface IEntityMetadata
    {
        [Required]
        Int32 Id { get; set; }
    }

    [MetadataType(typeof(IEntityMetadata))]
    public partial class Entity : IEntityMetadata
    {
        /* Id property has already existed in the mapped class */
    }
}

PS यदि आप प्रोजेक्ट प्रकार का उपयोग कर रहे हैं, जो ASP.NET MVC से भिन्न है (जब आप मैन्युअल डेटा सत्यापन करते हैं) तो अपने सत्यापनकर्ताओं को पंजीकृत करना न भूलें

/* Global.asax or similar */

TypeDescriptor.AddProviderTransparent(
    new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Entity), typeof(IEntityMetadata)), typeof(Entity));

@dimonser अच्छा समाधान, मैंने xml टिप्पणियों को इस तरह से भी जोड़ने की कोशिश की (उन DB क्षेत्रों के लिए जिन्हें कोड में थोड़ी व्याख्या की आवश्यकता है - यानी इंटेलीसिटी में प्रदर्शित किया जाना है) लेकिन यह काम नहीं करता है। किसी भी विचार कैसे करना है?
पर्सी

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

वास्तव में अच्छी तरह से सोचा बाहर जवाब है, लेकिन मेरी प्राथमिकता संकलन त्रुटियों को देखने के लिए होगी यदि सत्यापन अब ऑटोगेन्जेनेटेड इकाई फ्रेमवर्क क्लास के साथ सिंक में नहीं है। मैं एक ऐसी स्थिति के बारे में सोचने के लिए संघर्ष कर रहा हूँ जहाँ आप एक ऐसी संपत्ति को मान्य करना चाहते हैं जो अब आपके इकाई ढांचे के वर्ग में मौजूद नहीं है।
माइक

1
यह मेरे लिए काम नहीं करता है, यह कहता है कि मुझे IEntityMetadata इंटरफ़ेस को लागू करने की आवश्यकता है ...
Worthy7

14

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

using System.ComponentModel.DataAnnotations;

namespace MvcApplication1.Models 
{
    [MetadataType(typeof(MetaData))]
    public partial class ItemRequest
    {
        public class MetaData
        {
            [Required]
            public int RequestId;

            //...
        }
    }
}

मैं अपने पूरे प्रोजेक्ट में इसका इस्तेमाल कर रहा हूं। व्यवस्थित करने के लिए बहुत आसान है। मैं [NotMapped]आंशिक वर्ग के अंदर भी कस्टम गुणों को जोड़ता हूं जब मुझे उनकी आवश्यकता होती है।
कार्टर मेडलिन

5

यह @dimonser उत्तर के विस्तार के प्रकार है यदि आप अपने db मॉडल को पुन: उत्पन्न करते हैं, तो आपको उन कक्षाओं में मैन्युअल रूप से पुन: जोड़ना होगा।

यदि आपके पास इसके लिए पेट है तो आप अपने को संशोधित भी कर सकते हैं .tt टेम्प्लेट :

यहाँ कुछ वर्गों पर ऑटो-जनरेटिंग इंटरफेस का उदाहरण दिया गया है, यह आपके (और जाहिर तौर पर आपके इकाई के नाम और इंटरफेस के साथ) विधि को .ttबदलने की EntityClassOpeningविधि है var stringsToMatch

public string EntityClassOpening(EntityType entity)
{
    var stringsToMatch = new Dictionary<string,string> { { "Answer", "IJourneyAnswer" }, { "Fee", "ILegalFee" } };
    return string.Format(
        CultureInfo.InvariantCulture,
        "{0} {1}partial class {2}{3}{4}",
        Accessibility.ForType(entity),
        _code.SpaceAfter(_code.AbstractOption(entity)),
        _code.Escape(entity),
        _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)),
        stringsToMatch.Any(o => _code.Escape(entity).Contains(o.Key)) ? " : " + stringsToMatch.Single(o => _code.Escape(entity).Contains(o.Key)).Value : string.Empty);
}

किसी भी सामान्य व्यक्ति को खुद से ऐसा नहीं करना चाहिए, हालांकि बाइबल में यह साबित किया गया है कि कोई इसके लिए नर्क जाता है।


2

मुझे यकीन नहीं है कि आप कैसे कर रहे हैं जो आप पूछ रहे हैं लेकिन इसके चारों ओर एक रास्ता है। अपने कस्टम DataAnnotationsModelValidatorProvider के GetValidators ओवरराइड करके गतिशील डेटा सत्यापन। इसमें आप प्रत्येक क्षेत्र (डेटाबेस, कॉन्फिग फ़ाइल, आदि से) को सत्यापित करने के लिए नियम पढ़ सकते हैं और आवश्यकतानुसार सत्यापनकर्ताओं को जोड़ सकते हैं। इसमें जोड़े गए मान हैं कि आपका सत्यापन अब मॉडल के साथ कसकर नहीं जोड़ा गया है और साइट को पुनरारंभ करने की आवश्यकता के बिना भी बदला जा सकता है। बेशक यह आपके मामले के लिए ओवरकिल हो सकता है, लेकिन यह हमारे लिए आदर्श था!


हमने तब किया जब हमने पहली बार इस संरचना को लागू किया था। हम तब से NHibernate में चले गए हैं, लेकिन इसका समाधान पर कोई असर नहीं है। हमारे सत्यापन कोड ने बिना किसी परिवर्तन के साथ काम किया है (केवल डेटा एक्सेस परत को बदल दिया गया था)।
JTMon

1

आवश्यक एनोटेशन जोड़ते हुए T4 टेम्प्लेट को संशोधित करें, इस फ़ाइल को आमतौर पर MODELNAME.tt नाम दिया गया है

पता लगाएं कि टी 4 कहां कक्षा और तरीके बना रहा है, यह जानने के लिए कि इन्हें कहां रखा जाए।

     <#=codeStringGenerator.IgnoreJson(navigationProperty)#>


//create this method in file
public string IgnoreJson(NavigationProperty navigationProperty){
            string result = navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? "" : @"[JsonIgnore]
    [IgnoreDataMember]";

            return result;
        }

आपको नामस्थान जोड़ने की भी आवश्यकता होगी;

<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json;
using System.Runtime.Serialization;

अपने मॉडल को सहेजकर अपनी कक्षाओं का पुनर्निर्माण करें, आपके सभी तरीकों को एनोटेट किया जाना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.