সত্তা ফ্রেমওয়ার্ক দ্বারা উত্পন্ন ক্লাসে ডেটা টীকা যুক্ত করুন


94

সত্তা কাঠামোর দ্বারা আমার নিম্নলিখিত ক্লাস তৈরি হয়েছে:

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

আমি এটিকে একটি প্রয়োজনীয় ক্ষেত্র তৈরি করতে চাই

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

তবে এটি কোড উত্পন্ন হওয়ার কারণে এটি মুছে যাবে। আমি আংশিক শ্রেণি তৈরির কোনও উপায় কল্পনা করতে পারি না কারণ উত্পন্ন আংশিক শ্রেণীর দ্বারা সম্পত্তি সংজ্ঞায়িত করা হয়। আমি কীভাবে নিরাপদ উপায়ে সীমাবদ্ধতার সংজ্ঞা দিতে পারি?


আপনার সম্পত্তি যদি অন্তর্নিহিত থাকে তবে এটি মডেলবাইন্ডারের জন্য ডিফল্টরূপে প্রয়োজনীয় তাই আপনার [প্রয়োজনীয়] বৈশিষ্ট্যটি এখানে কোনও কিছুই যুক্ত করবে না।
কিরিল বেস্তেমিয়ানভ

@ কিরিলবেস্টেমিয়ানভ - @ এইচটিএমএল.ভালিডেশনমেসেজ ফর (মডেল => মডেল। আইটেম.আইটেম. রিসোর্স টাইপআইডি) ক্লায়েন্টের পক্ষ থেকে ব্যর্থ হওয়া উচিত। এটা না.
পি। ব্রায়ান.ম্যাকি

উত্তর:


144

উত্পন্ন শ্রেণি 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;}

        //...
    }
}

12
আংশিক শ্রেণি পুনর্গঠিত হবে না। এটি আংশিক হিসাবে সংজ্ঞায়িত করার কারণ।
MUG4N

আপনি আংশিক সংশোধক মিস করেছেন? আপনি কি একই নামস্থান ব্যবহার করেন?
MUG4N

5
। নেট কোর ব্যবহারকারী: মেটাডেটাটাইপের পরিবর্তে মডেলমেটাডেটাটাইপ ব্যবহার করুন ।
বব কাউফম্যান

4
নেমস্পেসটি যতক্ষণ চাই না কেন আপনি আংশিক শ্রেণি স্থাপন করতে পারেন
MUG4N

40

MUG4N উত্তর হিসাবে আপনি আংশিক ক্লাস ব্যবহার করতে পারেন তবে পরিবর্তে আরও ভাল ব্যবহারের ইন্টারফেস হবে। এই ক্ষেত্রে আপনার সংকলন ত্রুটি থাকবে যদি ইএফ মডেল বৈধতা মডেলের সাথে সামঞ্জস্য না করে। সুতরাং আপনি আপনার ইএফ মডেলগুলিকে ভীতি ছাড়াই সংশোধন করতে পারেন যে বৈধকরণের নিয়মগুলি পুরানো।

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 */
    }
}

পিএস যদি আপনি প্রকারের প্রকারটি ব্যবহার করেন যা এএসপি.নেট এমভিসি থেকে পৃথক হয় (যখন আপনি ম্যানুয়াল ডেটা বৈধকরণ সম্পাদন করেন) আপনার ভ্যালিডিটারগুলি নিবন্ধন করতে ভুলবেন না

/* Global.asax or similar */

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

@ ডিমনসার চমৎকার সমাধান, আমি এই জাতীয় xML মন্তব্য যুক্ত করার চেষ্টা করেছি (সেইসব ডিবি ক্ষেত্রগুলির জন্য যাদের কোডে কিছুটা ব্যাখ্যা প্রয়োজন - অর্থাত্ ইন্টেলিটিপে প্রদর্শিত হবে) তবে এটি কার্যকর হবে বলে মনে হয় না। কোন ধারণা কিভাবে এটি করতে?
পার্সি

হাই @ রিক, আপনি একটি ইন্টারফেসের সম্পত্তি সম্পর্কে একটি মন্তব্য রাখতে পারেন, তবে আপনি কেবল তখনই এটি দেখতে পাবেন যখন আপনি কোনও ইন্টারফেস ভেরিয়েবলের সাথে কাজ করবেন। অথবা আপনি একটি আংশিক শ্রেণিতে একটি মন্তব্য রাখতে পারেন। এই ক্ষেত্রে আপনি এটি আপনার ক্লাসের উদাহরণের সাথে কাজ করার সময় দেখতে পাবেন। অন্য কোন মামলা উপলব্ধ। সুতরাং আপনি উভয়টি সমস্ত পরিস্থিতি কভার করতে ব্যবহার করতে পারেন, প্রথম ক্ষেত্রে আপনি ক্ষেত্র বৈধতা সংক্রান্ত বিধিগুলি বর্ণনা করতে পারেন এবং দ্বিতীয় ক্ষেত্রে উদ্দেশ্যগুলি বর্ণনা করার চেষ্টা করুন
ডিমোনসার

উত্তরটি খুব ভালভাবেই ভাবা হয়েছে, তবে আমার পছন্দটি যদি স্বীকৃতিপ্রাপ্ত সত্তা কাঠামো শ্রেণীর সাথে বৈধতাটির সাথে আর সুসংগত না হয় তবে সংকলন ত্রুটিগুলি দেখতে আমার পছন্দ হবে। আমি এমন পরিস্থিতিতে ভাবতে লড়াই করছি যেখানে আপনি কোনও সম্পত্তি যাচাই করতে চাইতে পারেন যা আপনার সত্তা ফ্রেমওয়ার্ক ক্লাসে আর নেই।
মাইক

4
এটি আমার পক্ষে কাজ করে না, এটি বলে যে আমার আইএনটিটিমেটাডাটা ইন্টারফেসটি প্রয়োগ করা দরকার ...
মূল্যবান 7

14

আমি এমজিজি 4 এন এর উত্তরের মতো একটি সমাধান পেয়েছি , তবে পরিবর্তে MetaDataসত্তা শ্রেণীর মধ্যে শ্রেণিটি বাসা বাঁধে , এর ফলে আপনার পাবলিক নেমস্পেস তালিকায় শ্রেণীর সংখ্যা হ্রাস করে এবং প্রতিটি মেটাডেটা ক্লাসের জন্য একটি অনন্য নাম থাকার প্রয়োজনীয়তা দূর করে।

using System.ComponentModel.DataAnnotations;

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

            //...
        }
    }
}

আমি আমার প্রকল্পে এটি ব্যবহার করে যাচ্ছি। সংগঠিত করা অনেক সহজ। আমার [NotMapped]যখন প্রয়োজন হয় তখন আমি আংশিক শ্রেণীর ভিতরেও কাস্টম বৈশিষ্ট্য যুক্ত করি।
কার্টার মেডলিন

5

এটি আপনার ডিবি মডেলটি পুনরায় জেনারেট করলে আপনাকে সেই ডিগ্রীগুলিতে ম্যানুয়ালি পুনরায় যুক্ত করতে হবে @

আপনার যদি এটির পেট থাকে তবে আপনি আপনার .ttটেম্পলেটগুলিও সংশোধন করতে পারেন :

কিছু শ্রেণিতে স্বয়ংক্রিয় উত্পন্ন ইন্টারফেসের উদাহরণ, এটি অনুসরণের (এবং স্পষ্টত আপনার সত্তার নাম এবং ইন্টারফেসের সাথে) আপনার সাথে পদ্ধতি .ttপ্রতিস্থাপন থেকে খণ্ডন ।EntityClassOpeningvar 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

আপনি যা চাইছেন তা কীভাবে করবেন তা সম্পর্কে আমি নিশ্চিত নই তবে এর চারপাশের একটি উপায় রয়েছে। আপনার কাস্টম ডেটা অ্যানোটেশনমডেলভালিডেটরপ্রোভাইডারের গেটভালিডেটরগুলিকে ওভাররাইড করে গতিশীল ডেটা বৈধতা। এতে আপনি প্রতিটি ক্ষেত্রকে বৈধ করার জন্য (একটি ডাটাবেস, কনফিগারেশন ফাইল, ইত্যাদি) থেকে বিধিগুলি পড়তে পারেন এবং প্রয়োজন অনুসারে ভ্যালিডেটর যুক্ত করতে পারেন। এতে যুক্ত হওয়া মান রয়েছে যে আপনার বৈধতাটি আর শক্তভাবে মডেলটির সাথে মিলিত হয়নি এবং এমনকি সাইটটি পুনরায় আরম্ভ করার প্রয়োজন ছাড়াই পরিবর্তন করা যেতে পারে। অবশ্যই এটি আপনার ক্ষেত্রে অত্যধিক দক্ষ হতে পারে তবে এটি আমাদের পক্ষে আদর্শ ছিল!


আমরা প্রথম যখন এই কাঠামোটি বাস্তবায়িত করেছি তখন আমরা তা করেছি। আমরা তখন থেকে এনএইচবারনেটে চলে এসেছি, তবে সমাধানের ক্ষেত্রে এর কোনও ফল নেই। আমাদের বৈধকরণ কোডটি কোনও পরিবর্তন ছাড়াই কাজ করেছে (কেবলমাত্র ডেটা অ্যাক্সেস স্তর পরিবর্তন করা হয়েছিল)।
জেটিমন

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;

আপনার মডেলটি সংরক্ষণ করে আপনার ক্লাসগুলি পুনর্নির্মাণ করুন, আপনার সমস্ত পদ্ধতিতে টীকা দেওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.