2013-09-04 18 views
5

मेरे पास डेटा एक्सेस लेयर में एंटीटी फ्रेमवर्क (ईएफ) डेटाबेस का उपयोग कर एक प्रोग्राम है। मुझे पता है कि आदेश के लिए एफई कई रिश्ते के लिए कई के नेविगेशन गुण स्वत: उत्पन्न करने के लिए, मानचित्रण तालिका केवल एक समग्र प्राथमिक कुंजी शामिल करने की जरूरत है:अतिरिक्त फ़ील्ड के साथ कई रिश्तों के लिए एंटीटी फ्रेमवर्क (डाटाबेस फर्स्ट)

Project 
    - ProjectId (PK) 
    - Name 

ContentType 
    - ContentTypeId (PK) 
    - Name 

ProjectContentTypeMapping 
    - ProjectId (PK) 
    - ContentTypeId (PK) 

इस मामले में सब कुछ ठीक काम करता है, और मैं यह कर सकते हैं ContentTypes से परियोजनाओं तक पहुंचें और नेविगेशन गुणों के साथ अन्य तरीकों तक पहुंचें।

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

क्या कोई तरीका है कि मैं ईएफ (डेटाबेस प्रथम) में इन दो तालिकाओं के बीच मैपिंग मैन्युअल रूप से कॉन्फ़िगर कर सकता हूं? वैकल्पिक रूप से, मैं इसका प्रतिनिधित्व कैसे कर सकता हूं? मैं शायद मानचित्रण मेज पर एक FK के साथ एक अतिरिक्त "मेटाडेटा" तालिका होने के बारे में सोच रहा था, लेकिन यह "hacky" मेरे लिए लग रहा है ...

धन्यवाद

उत्तर

7

नहीं, आप में अतिरिक्त कॉलम नहीं हो सकता इकाई ढांचे में आपकी मैपिंग तालिका। क्योंकि, एक अतिरिक्त कॉलम होने का तात्पर्य है कि आप इसका उपयोग करना चाहते हैं, लेकिन मैपिंग टेबल इकाई का हिस्सा नहीं हैं, इसलिए, इकाई ढांचा, अब मैपिंग तालिका के रूप में अतिरिक्त कॉलम के साथ आपकी मैपिंग तालिका का इलाज नहीं करता है। आपको मैन्युअल रूप से मैपिंग में हेरफेर करना होगा।

चलें अपनी कक्षाओं का उदाहरण लेते हैं:

Project prj = new Project(); 
//fill out scalar properties 
ProjectContentTypeMapping pctm = new ProjectContentTypeMapping(); 
pctm.ContentTypeId = 1; //or whatever you want, or selected from UI 

prj.ProjectContents = new ProjectContentTypeMapping(); 
prj.ProjectContents.Add(pctm); 

dataContext.Projects.Add(prj); 
:

Project 
    - ProjectId (PK) 
    - Name 
    - ProjectContents 

ContentType 
    - ContentTypeId (PK) 
    - Name 
    - ProjectContents 

ProjectContentTypeMapping 
    - ProjectId (PK) 
    - ContentTypeId (PK) 
    - OtherRelevantColumn 

जहां ProjectContents प्रकार ProjectContentTypeMapping

इसलिए जब भी आप कुछ ContentType के साथ एक परियोजना को जोड़ने की है, तो आप यह कर की जाएगी

अब किसी मौजूदा प्रोजेक्ट में संपादन (सामग्री प्रकार जोड़ना) के मामले में, आप prj.ProjectContents = new ... नहीं करेंगे, बल्कि यह केवल तभी होगा जब यह हो अशक्त मैं, ई,

if(prj.ProjectContents==null) 
    prj.ProjectContents = new ProjectContentTypeMapping(); 

भी एक बहुत बहुत महत्वपूर्ण बात है, के बाद से अब अपनी ProjectContentTypeMapping अब एक मानचित्रण तालिका है, इसलिए, एक परियोजना को हटाने आप एक त्रुटि, देना होगा अगर अपने आईडी ProjectContentTypeMapping में मौजूद किया जा रहा है तालिका; आपको उन्हें मैन्युअल रूप से हटा देना होगा i.e

foreach(var pctm in prj.ProjectContents.ToList()) 
{ 
    prj.ProjectContents.Remove(pctm); 
    datacontext.ProjectContentTypeMappings.Remove(pctm); 
} 
datacontext.Remove(prj); 
datacontext.SaveChanges(); 
+0

क्या आप मैपिंग मैन्युअल रूप से कुशलतापूर्वक उपयोग करने के बारे में अधिक जानकारी प्रदान कर सकते हैं? – chuwik

+0

मेरा उत्तरदाता @chuwik –

+3

देखें क्या अतिरिक्त कॉलम होना संभव नहीं है लेकिन तालिका के इलाज के लिए एंटिटी फ्रेमवर्क को बताएं जैसे कि यह नहीं था? डेटाबेस से पूरी तालिका के बजाय किसी भी तरह से केवल दो कॉलम आयात करें? मुझे डीबी में अन्य कारणों (कार्यस्थल नीति, अन्य अनुप्रयोग जो एक ही डेटाबेस का उपयोग करते हैं) के लिए अतिरिक्त कॉलम की आवश्यकता है, लेकिन मेरे आवेदन को उनसे अवगत भी नहीं होना चाहिए। –

संबंधित मुद्दे