2013-02-14 18 views
52

संक्षेप में, मैं SQL सर्वर खोज प्रदर्शन को बेहतर बनाने के लिए प्राथमिक कुंजी के साथ शेष तालिका में समग्र कुंजी बनाना चाहता हूं। जब भी मैं प्राथमिक कुंजी के बिना एक इकाई खोजता हूं (यानी GUID की एक स्ट्रिंग) तो प्रदर्शन समस्या 200k डेटा तालिका पर होती है। मान लें मैं 3 वर्गोंसमग्र कुंजी इकाई फ्रेमवर्क बनाना

public class Device{ 

    public int ID { get; set; } 
    public string UDID { get; set; } 
    public string ApplicationKey { get; set; } 
    public string PlatformKey { get; set; } 

    public ICollection<NotificationMessageDevice> DeviceMessages { get; set; } 
} 

public class NotificationMessageDevice { 

    [Column(Order = 0), Key, ForeignKey("NotificationMessage")] 
    public int NotificationMessage_ID { get; set; } 

    [Column(Order = 1), Key, ForeignKey("Device")] 
    public int Device_ID { get; set; } 

    public virtual Device Device { get; set; } 
    public virtual NotificationMessage NotificationMessage { get; set; } 
} 

public class NotificationMessage { 

    public int ID { get; set; } 
    public string Text { get; set; } 
    public DateTime CreateDate { get; set; } 
} 

     modelBuilder.Entity<Device>().HasKey(t => new { t.ID, t.ApplicationKey, t.PlatformKey, t.UDID }); 

क्या समस्या यह है कि जब भी मैं आईडी बनाना चाहते, UDID, ApplicationKey और PlatformKey एक समग्र कुंजी modelBuilder साथ यह निम्नलिखित त्रुटि देता है के रूप में परिभाषित है है।

NotificationMessageDevice_Device_Target_NotificationMessageDevice_Device_Source: : एक संबंध बाधा में आश्रित और प्रधान भूमिकाओं में प्रॉपर्टी की संख्या समान होना चाहिए

मुझे लगता है कि समस्या यह है क्योंकि NotificationMessageDevice पर नेविगेशन संपत्ति पहचान करने में सक्षम नहीं है डिवाइस तालिका पर प्राथमिक कुंजी क्या है। मैं यह मुश्किल कैसे सुलझाऊँ? इसके अतिरिक्त यदि आप अपने अनुभवों को इकाई ढांचे पर खोज प्रदर्शन में सुधार करते हैं तो मुझे खुशी होगी। आमतौर पर जब भी मैं प्राथमिक कुंजी के बिना पहली विधि का उपयोग करता हूं तो प्रदर्शन समस्या होती है।

+0

मैं ईएफ विकास के लिए बहुत कुछ नहीं हूं, लेकिन क्या आपके पास गलत चीज़ पर 'विदेशीकी एट्रिब्यूट' नहीं है? –

+1

सही यह सही है :) – kkocabiyik

उत्तर

73

डिवाइस तालिका समग्र प्राथमिक कुंजी है, तो आप अपने NotificationMessageDevice मेज पर एक ही समग्र विदेशी कुंजी की जरूरत है। एसक्यूएल पूर्ण प्राथमिक कुंजी के बिना डिवाइस कैसे ढूंढेगा? साथ ही आपको इन क्षेत्रों को अधिसूचना मैसेजडिवाइस तालिका प्राथमिक कुंजी का हिस्सा बनना चाहिए। अन्यथा आप गारंटी नहीं दे सकते कि प्राथमिक कुंजी अद्वितीय होगी:

public class NotificationMessageDevice 
{ 
    [Column(Order = 0), Key, ForeignKey("NotificationMessage")] 
    public int NotificationMessage_ID { get; set; } 

    [Column(Order = 1), Key, ForeignKey("Device")] 
    public int Device_ID { get; set; } 
    [Column(Order = 2), Key, ForeignKey("Device")] 
    public string Device_UDID { get; set; } 
    [Column(Order = 3), Key, ForeignKey("Device")] 
    public string Device_ApplicationKey { get; set; } 

    public virtual Device Device { get; set; } 
    public virtual NotificationMessage NotificationMessage { get; set; } 
} 
+0

क्या यह आवश्यक है कि हमें समग्र कुंजी पर परिभाषित सभी गुणों को लागू करने की आवश्यकता हो, जब भी हम डिवाइस ऑब्जेक्ट को नेविगेशन प्रॉपर्टी के रूप में उपयोग करते हैं तो लक्ष्य तालिका पर लागू किया जाना चाहिए। – kkocabiyik

+0

हां, यह डेटाबेस में विदेशी कुंजी होगी। विदेशी कुंजी मूल तालिका से प्राथमिक कुंजी है, इसलिए यह बिल्कुल वही होना चाहिए। बीटीडब्ल्यू अगर आप 'प्लेटफार्मके' को डिवाइस पीके का हिस्सा बनना चाहते हैं, तो आपको अधिसूचना मैसेजडिवाइस में उस क्षेत्र की आवश्यकता है –

+0

हम्म एक और सवाल, क्या एंटीटी फ्रेमवर्क पर सुपर कुंजी बनाने का कोई तरीका है? – kkocabiyik

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