2011-05-16 13 views
26

मैं ईएफ कोड फर्स्ट के साथ मौजूदा डेटाबेस में वैकल्पिक 1-से-1 संबंध मैप करना चाहता हूं।ईएफ कोड प्रथम - 1-से-1 वैकल्पिक संबंध

सरल स्कीमा:

User 
Username 
ContactID 

Contact 
ID 
Name 

जाहिर ContactID Contact.ID को मिलती है। ContactID फ़ील्ड शून्य है इसलिए संबंध वैकल्पिक है - 0 या 1, कभी भी कई नहीं।

तो मैं इस मौजूदा स्कीमा के साथ ईएफ कोड फर्स्ट में इस संबंध को कैसे निर्दिष्ट करूं?

public class User 
{ 
    [Key] 
    public string Username { get; set; } 
    public int? ContactID { get; set; } 

    [ForeignKey("ContactID")] 
    public virtual Contact Contact { get; set; } 
} 

public class Contact 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public virtual User User { get; set; } 
} 

modelBuilder.Entity<User>().HasOptional<Contact>(u=> u.Contact) 
    .WithOptionalDependent(c => c.User); 

मैं निम्न अपवाद प्राप्त:

यहाँ मैं अब तक की कोशिश की है है

System.Data.Edm.EdmAssociationEnd: : Multiplicity is not valid in Role 
'User_Contact_Source' in relationship 'User_Contact'. Because the Dependent 
Role properties are not the key properties, the upper bound of the multiplicity 
of the Dependent Role must be *. 

उत्तर

42

एक समाधान हो सकता है;

public class User 
{ 
    [Key] 
    public string Username { get; set; } 

    public virtual Contact Contact { get; set; } 
} 

public class Contact 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public virtual User User { get; set; } 
} 

     modelBuilder.Entity<User>() 
      .HasOptional<Contact>(u => u.Contact) 
      .WithOptionalDependent(c => c.User).Map(p => p.MapKey("ContactID")); 

आप अपने Pocos में केवल अपने नौवहन वस्तुओं की स्थापना की और इसके बजाय आप धाराप्रवाह एपीआई का उपयोग सही स्तंभ की कुंजी मैप करने के लिए।

+0

इससे मुझे 0: 1 से 0: 1 को कॉन्फ़िगर करने का प्रयास करते समय निम्न को हल करने में मदद मिली - इस एसोसिएशन का मूल अंत स्पष्ट रूप से रिलेशनशिप फ्लिप एपीआई या डेटा एनोटेशन का उपयोग करके कॉन्फ़िगर किया जाना चाहिए। –

+1

मैं आपको सलाह देता हूं कि आप सम्मेलन के अनुसार विदेशी कुंजी संपत्ति शामिल करें (https://msdn.microsoft.com/en-us/data/jj679962)। यदि भी आप संस्थाओं के बीच रिश्ते बनाते हैं, तो इसे इकाई की संपत्ति के बजाय इस महत्वपूर्ण संपत्ति के माध्यम से करें। मुझे इस तरह से कुछ अपवाद प्राप्त होने की संभावना कम है जैसे ऑब्जेक्ट स्टेट मैनेजर में डुप्लिकेट कुंजियां और अपडेट गलत होने पर अधिक सार्थक अपवाद। – MIP1983

+9

मैं 'उपयोगकर्ता 'में' ContactId' फ़ील्ड का उपयोग कैसे कर सकता हूं? यदि मैं उपरोक्त कोड का उपयोग करता हूं और उपयोगकर्ता में 'ContactId' फ़ील्ड को परिभाषित करता हूं तो यह मुझे एक त्रुटि देता है कि यह एक डुप्लिकेट संपत्ति है। मैं इकाई ढांचे को कैसे बता सकता हूं कि 'MapKey' के साथ परिभाषित कॉलम और उपयोगकर्ता में परिभाषित' ContactId' समान है। –

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