अपडेट करें: मैं हाल ही में इस पर कुछ upvotes मिल गया है, तो मुझे लगा कि मैं लोगों को सलाह देना होगा कि मैं नीचे दे सबसे अच्छा नहीं है। चूंकि मैंने मूल रूप से पुराने बिना चाबी वाले डेटाबेस पर एंटिटी फ्रेमवर्क करने के साथ छेड़छाड़ करना शुरू कर दिया है, इसलिए मुझे पता चला है कि BY FAR द्वारा सबसे अच्छी चीज जो आप कर सकते हैं वह है रिवर्स कोड-प्रथम। ऐसा करने के लिए वहाँ पर कुछ अच्छे लेख हैं। बस उनका अनुसरण करें, और फिर जब आप इसमें एक कुंजी जोड़ना चाहते हैं, तो कुंजी को "नकली" करने के लिए डेटा एनोटेशन का उपयोग करें।
उदाहरण के लिए, मान लें कि मुझे अपनी तालिका पता है Orders
, जबकि इसकी प्राथमिक कुंजी नहीं है, केवल ग्राहक के प्रति एक आदेश संख्या रखने का आश्वासन दिया गया है। चूंकि वे टेबल पर पहले दो कॉलम हैं, इसलिए मैं इस तरह दिखने के लिए कोड पहली कक्षाएं स्थापित करूंगा:
[Key, Column(Order = 0)]
public Int32? OrderNumber { get; set; }
[Key, Column(Order = 1)]
public String Customer { get; set; }
ऐसा करने से, आप मूल रूप से ईएफ को विश्वास में लेते हैं कि ऑर्डरनंबर और ग्राहक से मिलकर एक संकुल कुंजी है। इससे आप अपनी कीलेस टेबल पर इंसर्ट, अपडेट आदि कर सकेंगे।
यदि आप रिवर्स कोड फर्स्ट करने से बहुत परिचित नहीं हैं, तो जाएं और एंटिटी फ्रेमवर्क कोड फर्स्ट पर एक अच्छा ट्यूटोरियल ढूंढें। फिर रिवर्स कोड फर्स्ट पर एक खोजें (जो मौजूदा डेटाबेस के साथ कोड फर्स्ट कर रहा है)। तो बस यहाँ वापस आओ और फिर से मेरी महत्वपूर्ण सलाह को देखो। :)
मूल उत्तर :
पहला: जैसा कि दूसरों ने कहा है, सबसे अच्छा विकल्प तालिका में एक प्राथमिक कुंजी जोड़ना है। पूर्ण विराम। यदि आप ऐसा कर सकते हैं, तो आगे पढ़ें।
लेकिन अगर आप अपने आप से नफरत नहीं कर सकते, या नहीं कर सकते, तो प्राथमिक कुंजी के बिना ऐसा करने का एक तरीका है।
मेरे मामले में, मैं एक विरासत प्रणाली के साथ काम कर रहा था (मूल रूप से एक AS400 पर फ्लैट फाइलें एक्सेस और फिर टी-एसक्यूएल में रखी गई)। इसलिए मुझे एक रास्ता खोजना पड़ा। यह मेरा समाधान है। निम्नलिखित ने मेरे लिए Entity Framework 6.0 (इस लेखन के रूप में NuGet पर नवीनतम) का उपयोग करके काम किया।
समाधान एक्सप्लोरर में अपनी .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>
टैग ढूंढें । इसमें एक बड़ा ol 'सेलेक्ट स्टेटमेंट होगा। टैग निकालें और यह सामग्री है।
अब आपकी लाइन कुछ इस तरह दिखनी चाहिए:
<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);
अंदाज़ा लगाओ? मैंने अभी डुप्लिकेट और मूल दोनों को हटा दिया है! ऐसा इसलिए है क्योंकि मैंने एंटिटी फ्रेमवर्क को बताया है कि order_number / cutomer_name मेरी प्राथमिक कुंजी थी। इसलिए जब मैंने इसे डुप्लिकेट को हटाने के लिए कहा था, तो उसने पृष्ठभूमि में जो किया वह कुछ इस तरह था:
DELETE FROM orders
WHERE order_number = (duplicateOrder's order number)
AND customer_name = (duplicateOrder's customer name)
और उस चेतावनी के साथ ... आपको अब जाना अच्छा होना चाहिए!