সত্তা ফ্রেমওয়ার্ক কোড প্রথম - উপার্জন এবং ডেটা টীকা বনাম অপরিহার্যতা [বন্ধ]


120

সত্তা ফ্রেমওয়ার্ক কোড-প্রথম ব্যবহার করে একটি ডাটাবেস তৈরি করার সময়, কোড থেকে প্রচুর ডাটাবেস মডেল বের করা যায় ext মডেল টিউন করার জন্য ফ্লুয়েন্ট এপিআই এবং / অথবা বৈশিষ্ট্যগুলি ব্যবহার করা যেতে পারে।

ডেটা টীকাগুলির তুলনায় ফ্লুয়েন্ট এপি-র সুবিধা এবং অসুবিধাগুলি কী কী? অন্য কথায়: এমনকি কিছু পরিস্থিতিতে উভয় পদ্ধতি ব্যবহার করা গেলেও কোন কোন ক্ষেত্রে একটি পদ্ধতি অপরটির উপরে থাকতে হবে?


3
কেবলমাত্র একটি ধারণা: আমি সাধারণত যা করি তা হ'ল আমার পোকোগুলির সাথে একটি মডেল প্রকল্প তৈরি করুন এবং তারপরে সংগ্রহশালার প্রকল্পে, বিশেষত EF এর জন্য পোকোগুলির একটি নতুন সেট তৈরি করুন এবং আমার টীকাগুলি সেখানে রেখে দিন। তারপরে আমি কেবল ম্যাপার ক্লাসে দুজনের মধ্যে ম্যাপ করব। এইভাবে, আমার মডেলটি অচ্ছুত থাকে এবং প্রয়োজনে আমার ডেটা কৌশলটি যুক্ত / পরিবর্তন করা সহজ করে তোলে (যেমন একটি এক্সএমএলরোপোসিটরি যুক্ত করুন এবং একই মডেল ক্লাসগুলি ব্যবহার করুন)।
আদিমুরো

1
আমি এখন ইএফসিওর এবং অতিরিক্ত লাইব্রেরি সহ টীকাটি পছন্দ করি। (কম কোড প্রয়োজন আছে এবং সব এক জায়গায় হয়) github.com/isukces/EfCore.Shaman - যোগ করুন এবং প্রসারিত বৈশিষ্ট্যাবলী github.com/borisdj/EFCore.FluentApiToAnnotation - দরকারী যখন ডিবি ইতিমধ্যে বিদ্যমান, বিপরীত- প্রকৌশল করছেন এবং স্যুইচ করার পরে কোড ফার্স্ট
বরিশডজ

উত্তর:


141

আপনি ডাটাঅনোটেশন দিয়ে যা কনফিগার করতে পারেন তার সবকিছুই ফ্লুয়েট এপিআই দ্বারা সম্ভব। বিপরীত সত্য নয়। সুতরাং, কনফিগারেশন বিকল্প এবং নমনীয়তার দৃষ্টিকোণ থেকে ফ্লুয়েন্ট এপিআই "আরও ভাল"।

কনফিগারেশন উদাহরণগুলি (নিশ্চিতভাবে সম্পূর্ণ তালিকা নয়) যা ফ্লুয়েট এপিআইতে সম্ভব তবে ডেটাঅনোটেশন (যতদূর আমি দেখতে পাচ্ছি) দ্বারা সম্ভব নয়:

  • ক্যাসকেডিং মুছে ফেলা বন্ধ করুন:

    .WillCascadeOnDelete(false)

  • ডাটাবেসে বিদেশী কী কলামের নাম উল্লেখ করুন যখন কীটি আপনার অবজেক্ট মডেলে প্রকাশিত হবে না:

    .Map(conf => conf.MapKey("MyForeignKeyID"))

  • সম্পর্কের সূক্ষ্ম দানাদার টিউনিং, বিশেষত সমস্ত ক্ষেত্রে যেখানে অ্যাসোসিয়েশনের কেবলমাত্র এক পক্ষ অবজেক্ট মডেলে প্রকাশিত হয়:

    .WithMany(...), WithOptional(...), WithRequiredDependent(...),WithRequiredPrincipal(...)

  • অবজেক্ট মডেল এবং ডাটাবেস টেবিলের মধ্যে উত্তরাধিকার ম্যাপিংয়ের স্পেসিফিকেশন (টেবিল-প্রতি-স্তরক্রম, টেবিল-প্রতি-প্রকার, সারণী-প্রতি-কংক্রিট-শ্রেণি):

    .Map<TDerived>(Action<EntityMappingConfiguration<TDerived>> ...)

সম্পাদনা: মাইক্রোসফ্ট ফ্লুয়েন্ট এপিআইকে একটি "উন্নত বৈশিষ্ট্য" হিসাবে বিবেচনা করে ( এখান থেকে উদ্ধৃতি ):

সাবলীল এপিআইকে আরও উন্নত বৈশিষ্ট্য হিসাবে বিবেচনা করা হয় এবং আপনার প্রয়োজনীয়তাগুলির জন্য আপনাকে সাবলীল এপিআই ব্যবহার করার প্রয়োজন না হলে আমরা ডেটা টীকাগুলি ব্যবহারের পরামর্শ দেব।

তবে আমার মতে আপনি খুব দ্রুত ডেটাঅনোটেশনগুলির সীমাবদ্ধতায় পৌঁছে গেছেন (সম্ভবত অত্যন্ত সাধারণ বস্তুর মডেলগুলি বাদে)। আপনি যদি ডেটাঅনোটেশন দিয়ে আপনার মডেল টিউন করতে না পারেন তবে আপনার শেষ অবলম্বনটি হ'ল ডিফল্ট ম্যাপিং কনভেনশনগুলি অনুসরণ করা (সেই নিয়ম অনুসারে আপনার সম্পত্তি নামকরণ করে)। বর্তমানে আপনি কনভেনশনগুলিকে ওভাররাইট করতে পারবেন না (কেবল তাদের অক্ষম করুন; এমএস ভবিষ্যতের EF রিলিজগুলিতে কনভেনশনগুলির জন্য কনফিগারেশন বিকল্প দেওয়ার ঘোষণা দিয়েছিল)। আপনি যদি নিজের অবজেক্টের মডেলটি সংজ্ঞায়িত করেন তবে আপনি যদি ম্যাপিং কনভেনশনগুলিতে বাধ্য হতে না চান তবে আপনার একমাত্র বিকল্প হ'ল ফ্লুয়েট এপিআই।

ফ্লুয়েন্ট এপিআই শিখাই প্রায় জরুরি imho, সহজ অ্যাপ্লিকেশনগুলির জন্য ডেটাঅ্যানোটেশনগুলি একটি সুন্দর are


2
আমি এই ক্ষেত্রে একটি নবাগত। ডেটাঅ্যানোটেশন যেমন করতে পারে তেমন ব্যবহারকারীর ইন্টারফেসগুলিকে বৈধতা দেওয়ার জন্য কী ফ্লাইট এপিআই ব্যবহার করা যেতে পারে?
আমার বগলে চুমু

27
@ কাউন্টারটারিরিস্ট: আমার মনে হয় না। উদাহরণস্বরূপ: আপনি যদি [Required]কোনও এএসপি.নেট এমভিসি অ্যাপ্লিকেশনটিতে কোনও সম্পত্তিতে এই বৈশিষ্ট্যটি রাখেন তবে এটি EF এবং এমভিসি উভয়ই বৈধতার উদ্দেশ্যে ব্যবহার করবে কারণ উভয়ই এই বৈশিষ্ট্যটি প্রক্রিয়া করতে পারে। কিন্তু এমভিসি ফ্লুয়েন্ট এপিআই কনফিগারেশন বুঝতে পারে না। সুতরাং, আপনি যদি এট্রিবিউটটি সরিয়ে ফেলে থাকেন এবং HasRequiredপরিবর্তে ফ্লুয়েন্ট এপিআই তে ব্যবহার করেন তবে EF এর জন্য এটি এমভিসির জন্য নয় তবে একই হবে। (আমার মতে বৈশিষ্ট্যগুলি আলাদা আলাদাভাবে নামকরণ করা উচিত ছিল, বিভিন্ন উপাদান এবং বিভিন্ন উদ্দেশ্যে ডেটাঅনোটেশন নেমস্পেসের ব্যবহার খুব বিভ্রান্তিকর।)
স্লুমা

4
এছাড়াও নোট [DefaultValue()]কোনওভাবে সাবলীলভাবে সম্ভব নয়।
ওয়েবনুব

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

7
আর্কিটেকচারাল দৃষ্টিকোণ থেকে, আমি অনুমান করি Fluent APIযে আপনার প্রয়োগের যুক্তিটি আপনার মধ্যে থাকবে DbContextএবং আপনার POCOপরিষ্কার রাখবে
লূক টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.