আপডেট: আমি ইদানীং এর জন্য কয়েকটি উত্স পেয়েছি, তাই আমি অনুভব করেছি যে আমি নীচে যে পরামর্শ দিচ্ছি তা সর্বোত্তম নয় let যেহেতু আমি মূলত পুরানো চাবিহীন ডেটাবেসগুলিতে সত্তা ফ্রেমওয়ার্কটি নিয়ে মাতামাতি শুরু করেছি, তাই আমি বুঝতে পেরেছি যে আপনি সবচেয়ে ভাল কাজ করতে পারেন তা হল বিপরীত কোড-প্রথম দ্বারা এটি করা। এটি কীভাবে করা যায় সে সম্পর্কে কয়েকটি ভাল নিবন্ধ রয়েছে। কেবল তাদের অনুসরণ করুন এবং তারপরে আপনি যখন এটিতে একটি কী যুক্ত করতে চান, কীটিকে "নকল" করতে ডেটা টীকাটি ব্যবহার করুন।
উদাহরণস্বরূপ, আসুন আমি বলি যে আমি আমার টেবিলটি জানি Orders
, যদিও এটিতে প্রাথমিক কী নেই, তবে প্রতি গ্রাহককে কেবলমাত্র একটি আদেশ নম্বর থাকবে বলে আশ্বাস দেওয়া হয়। যেহেতু এগুলি টেবিলের প্রথম দুটি কলাম, তাই আমি কোডটি প্রথম শ্রেণিগুলি এটির মতো দেখতে সেট আপ করতাম:
[Key, Column(Order = 0)]
public Int32? OrderNumber { get; set; }
[Key, Column(Order = 1)]
public String Customer { get; set; }
এটি করে আপনি মূলত ইএফকে বিশ্বাস করে নকল হন যে অর্ডার নাম্বার এবং গ্রাহকের সমন্বয়ে একটি ক্লাস্টার কী রয়েছে key এটি আপনাকে আপনার কীবিহীন টেবিলে সন্নিবেশ, আপডেট ইত্যাদি করতে দেবে।
যদি আপনি বিপরীত কোড ফার্স্ট করার সাথে খুব বেশি পরিচিত না হন, তবে সত্ত্বা ফ্রেমওয়ার্ক কোড ফার্স্ট সম্পর্কে একটি ভাল টিউটোরিয়ালটি সন্ধান করুন। তারপরে বিপরীত কোডের প্রথমটিতে একটি সন্ধান করুন (যা বিদ্যমান ডাটাবেসের সাথে কোড ফার্স্ট করছে)। তারপরে এখানে ফিরে আসুন এবং আমার মূল পরামর্শটি আবার দেখুন। :)
আসল উত্তর :
প্রথম: অন্যরা যেমন বলেছে, সারণীতে একটি প্রাথমিক কী যুক্ত করা সর্বোত্তম বিকল্প। দাড়ি. আপনি যদি এটি করতে পারেন তবে আর পড়বেন না।
তবে আপনি যদি না করতে পারেন বা কেবল নিজেকে ঘৃণা করেন তবে প্রাথমিক কী ছাড়া এটি করার একটি উপায় আছে way
আমার ক্ষেত্রে, আমি একটি লিগ্যাসি সিস্টেমের সাথে কাজ করছিলাম (মূলত কোনও AS400 এ ফ্ল্যাট ফাইলগুলি অ্যাক্সেসের জন্য পোর্ট করা হয়েছিল এবং তারপরে টি-এসকিউএল পোর্ট করা হয়েছিল)। সুতরাং আমাকে একটি উপায় খুঁজে বের করতে হয়েছিল। এটা আমার সমাধান। নিম্নলিখিতটি আমার জন্য সত্ত্বা ফ্রেমওয়ার্ক 6.0 (এই লেখার মতো নুগেটে সর্বশেষ) ব্যবহার করে কাজ করেছে।
সমাধান এক্সপ্লোরারটিতে আপনার .edmx ফাইলটিতে ডান ক্লিক করুন। "এর সাথে খুলুন ..." চয়ন করুন এবং তারপরে "এক্সএমএল (পাঠ্য) সম্পাদক" নির্বাচন করুন। আমরা এখানে স্বয়ংক্রিয়ভাবে উত্পন্ন কোড হ্যান্ড-এডিট করতে যাচ্ছি।
এর মতো লাইনটি দেখুন:
<EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" store:Schema="dbo" store:Name="table_nane">
store:Name="table_name"
শেষ থেকে সরান ।
পরিবর্তন store:Schema="whatever"
করুনSchema="whatever"
সেই লাইনের নীচে দেখুন এবং <DefiningQuery>
ট্যাগটি সন্ধান করুন। এটিতে একটি বড় অল 'সিলেক্ট স্টেটমেন্ট থাকবে। ট্যাগটি সরান এবং এর সামগ্রীগুলি।
এখন আপনার লাইনটি দেখতে এই জাতীয় কিছু দেখা উচিত:
<EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" Schema="dbo" />
আমাদের পরিবর্তনের আরও কিছু আছে। আপনার ফাইলের মাধ্যমে যান এবং এটি সন্ধান করুন:
<EntityType Name="table_name">
কাছাকাছি আপনি সম্ভবত কিছু মন্তব্যযুক্ত টেক্সট আপনাকে সতর্ক করে দেখবেন যে এটিতে একটি প্রাথমিক কী সনাক্ত করা হয়নি, সুতরাং কীটি অনুমান করা হয়েছে এবং সংজ্ঞাটি কেবল পঠনযোগ্য টেবিল / দর্শন। আপনি এটি ছেড়ে বা এটি মুছতে পারেন। আমি এটি মুছে ফেলেছি।
নীচে <Key>
ট্যাগ দেওয়া হয় । সন্নিবেশ / আপডেট / মুছে ফেলার জন্য সত্তা ফ্রেমওয়ার্ক এটি ব্যবহার করতে চলেছে। আপনি এই সঠিক কাজটি করে তা নিশ্চিত করুন। এই ট্যাগটিতে থাকা সম্পত্তি (বা বৈশিষ্ট্যগুলি) একটি অনন্য সনাক্তকরণযোগ্য সারি নির্দেশ করতে হবে। উদাহরণস্বরূপ, আসুন আমি বলি যে আমি আমার টেবিলটি জানি orders
, যদিও এটিতে প্রাথমিক কী নেই, তবে প্রতি গ্রাহককে কেবলমাত্র একটি আদেশ নম্বর থাকবে বলে আশ্বাস দেওয়া হয়।
আমার মতো দেখতে:
<EntityType Name="table_name">
<Key>
<PropertyRef Name="order_numbers" />
<PropertyRef Name="customer_name" />
</Key>
সিরিয়াসলি, এই ভুল করবেন না। আসুন আমরা বলি যে ডুপ্লিকেটগুলি কখনই না থাকা উচিত, কোনওভাবে দুটি ক্রম একই ক্রম নম্বর এবং গ্রাহকের নাম সহ আমার সিস্টেমে আসে। Whooops! একটি কী ব্যবহার না করার জন্য আমি এটিই পাই! সুতরাং আমি একটি মুছে ফেলার জন্য সত্ত্বা ফ্রেমওয়ার্ক ব্যবহার করি। যেহেতু আমি জানি ডুপ্লিকেটটি কেবল আজই অর্ডার করা হয়েছে, আমি এটি করি:
var duplicateOrder = myModel.orders.First(x => x.order_date == DateTime.Today);
myModel.orders.Remove(duplicateOrder);
কি অনুমান? আমি স্রেফ ডুপ্লিকেট এবং মূল দুটিই মুছলাম! কারণ আমি সত্ত্বা ফ্রেমওয়ার্ককে বলেছি যে অর্ডার_ নাম্বার / কাটোমার_নামটি আমার প্রাথমিক কী। সুতরাং যখন আমি এটি সদৃশ অর্ডার অপসারণ করতে বললাম, ব্যাকগ্রাউন্ডে এটি যা করেছিল তা এমন কিছু ছিল:
DELETE FROM orders
WHERE order_number = (duplicateOrder's order number)
AND customer_name = (duplicateOrder's customer name)
এবং সেই সতর্কতার সাথে ... আপনার এখন ভাল হওয়া উচিত!