7

मैं EntityFramework 5 का उपयोग कर रहाEntityFramework गुमनाम समग्र कुंजी संपत्ति नाम संघर्ष

(या 4.3 .Net Framework 4.0 के लिए) मेरे DbContext वस्तु में मैं पहले से ही सही DbSets की स्थापना की है और वस्तुओं एक दूसरे के लिए उचित संदर्भ होते हैं। यह मेरे लिए नया नहीं है, और चीजें अच्छी तरह से काम कर रही हैं।

अब इस मामले में मेरे पास कुछ समग्र कुंजी हैं, कभी-कभी, किसी तालिका की विदेशी कुंजी (या इस मामले में ऑब्जेक्ट) शामिल होती हैं। इसके लिए मैं HasKey<>() फ़ंक्शन को OnModelCreating डीबीकॉन्टेक्स्ट की विधि पर उपयोग करता हूं। जब इन गुणों के अलग-अलग नाम होते हैं, तो कोई समस्या नहीं होती है, लेकिन जब इन गुणों का एक ही नाम होता है, तो माइग्रेशन नहीं किया जा सकता है।

एक उदाहरण:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // ... 

     modelBuilder.Entity<PatientVisit>().ToTable("PatientVisits"); 
     modelBuilder.Entity<PatientVisit>().HasKey(x => 
      new { x.Patient.Code, x.Code }); 

     // ... 

     base.OnModelCreating(modelBuilder); 
    } 

आपके द्वारा दी गई कोड में देख सकते हैं, वस्तु PatientVisit एक संपत्ति कोड नाम दिया है, लेकिन इस संपत्ति के रूप में लंबे समय के रूप में यह एक अलग रोगी के साथ दोहराया है दोहराया जा सकता है। इकाई रोगी के पास एक महत्वपूर्ण परिभाषित नाम कोड भी है।

एक अज्ञात प्रकार में दो गुण नहीं हो सकते हैं जो एक ही नाम (स्पष्ट) हैं। ठेठ समाधान इस तरह गुमनाम प्रकार के गुण नाम के लिए होगा:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // ... 

     modelBuilder.Entity<PatientVisit>().ToTable("PatientVisits"); 
     modelBuilder.Entity<PatientVisit>().HasKey(x => 
      new { PatientCode = x.Patient.Code, VisitCode = x.Code }); 

     // ... 

     base.OnModelCreating(modelBuilder); 
    } 

लेकिन यह कर रही है, जब मैं एक प्रवास यह त्रुटि संदेश फेंक दिया जाता है जोड़ने के लिए प्रयास करें।

The properties expression 'x => new <>f__AnonymousType3`2(PatientCode 
= x.Patient.Code, VisitCode = x.Code)' is not valid. The expression 
should represent a property: C#: 't => t.MyProperty' VB.Net: 'Function(t) 
t.MyProperty'. When specifying multiple properties use an anonymous 
type: C#: 't => new { t.MyProperty1, t.MyProperty2 }' 
VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'. 

उत्तर

0

मैं तुम यहाँ क्या करने की जरूरत PatientVisit नई प्रॉपर्टी PatientCode दे रहा है लगता है। Patient पर विदेशी कुंजी कौन सा होगी। उदाहरण के लिए

HasRequired<PatientVisit>(v => v.Patient).WithMany() 
              .HasForeignKey(v => v.PatientCode) 

तो फिर तुम

modelBuilder.Entity<PatientVisit>().HasKey(x => 
     new { x.PatientCode, x.Code }); 
+1

मैं जानता हूँ कि समाधान मुझे मैन्युअल कुंजी और संदर्भित वस्तुओं की आईडी जोड़ने की आवश्यकता है कि देखते हैं क्या कर सकते हैं, लेकिन यह निकलता है एक डेटाबेस के लिए "बदलते" एक सरल ऑब्जेक्ट मॉडल मैपिंग मॉडल, और मैं ऐसा नहीं करना पसंद करता हूं। –

+0

आपका समाधान एक जैसा है जिसे मैंने कार्यान्वित किया है, केवल इतना है कि कोई धाराप्रवाह मैपिंग आवश्यक नहीं है क्योंकि यह डेटा एन्नोटेशन द्वारा किया जाता है। असल में यह एक आभासी नेविगेशन संपत्ति की विदेशी कुंजी को घोषित संपत्ति संलग्न करने के लिए 'विदेशीकी' विशेषता का उपयोग कर रहा है ... लेकिन फिर भी इसका तात्पर्य है कि _i को नेविगेशन गुण _and_ एंकर या विदेशी कुंजी गुणों को स्पष्ट रूप से परिभाषित करना है। मैं किसी भी डेटाबेस से संबंधित प्रमुख गुणों के बिना एक साफ, साफ ऑब्जेक्ट मॉडल रखना चाहता हूं। –

+0

_current-but-not-wanted_ समाधान का उदाहरण है जिसका मैं जिक्र कर रहा हूं, [यह थ्रेड] देखें (http://stackoverflow.com/questions/5388077/primary-foreign-key-in-entity-framework) जहां यह बहुत अच्छी तरह से समझाया गया है। –

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