2013-06-22 2 views
13

का उपयोग करके स्पष्ट रूप से कॉन्फ़िगर किया जाना चाहिए "इस एसोसिएशन का मुख्य अंत रिलेशनशिप फ्लिप एपीआई या डेटा एनोटेशन का उपयोग करके स्पष्ट रूप से कॉन्फ़िगर किया जाना चाहिए।"इस एसोसिएशन का मूल अंत स्पष्ट रूप से रिलेशनशिप धाराप्रवाह एपीआई या डेटा एनोटेशन

डेटाबेस में अद्यतन/माइग्रेट करते समय मुझे यह त्रुटि एंटिटी फ्रेमवर्क 4.4 में मिल रही है, लेकिन मैं 1: 1 संबंध निर्दिष्ट करने की कोशिश नहीं कर रहा हूं। मैं कुछ इस तरह हैं:

public class EntityA 
{ 
    public int ID { get; set; } 
    public int EntityBID { get; set; } 

    [ForeignKey("EntityBID")] 
    public virtual EntityB EntityB { get; set; } 
} 

public class EntityB 
{ 
    public int ID { get; set; } 
    public Nullable<int> PreferredEntityAID { get; set; } 

    [ForeignKey("PreferredEntityAID")] 
    public virtual EntityA PreferredEntityA { get; set; } 
} 

जहां EntityA एक EntityB माता पिता होना आवश्यक है, जबकि EntityB एक पसंदीदा EntityA बच्चा है सकते हैं, लेकिन करने के लिए नहीं है। पसंदीदा बच्चा माता-पिता से जुड़े बच्चों में से एक होना चाहिए, लेकिन मुझे नहीं पता कि डेटाबेस में इसे कैसे लागू किया जाए। मैं इसे प्रोग्रामेटिक रूप से लागू करने की योजना बना रहा हूं।

मैं इस त्रुटि के आसपास कैसे हो सकता हूं या इन रिश्तों को पूरा करने का एक बेहतर तरीका क्या है?

+1

'[ForeignKey (" EntityAID ") ] का मतलब है कि 'EntityB.EntityAID' संपत्ति होनी चाहिए। क्या आपने इसे नमूना में याद किया है? – Dennis

+1

क्या आपका मतलब है [विदेशीकी ("पसंदीदा एंटिटीएड")]? – ChaseMedallion

+0

इसे पकड़ने के लिए धन्यवाद। बस मेरे उदाहरण में इसे याद किया। मैंने इसे संपादित किया। – lintmouse

उत्तर

28

इकाई फ्रेमवर्क कोड-प्रथम सम्मेलन यह मानते हैं कि EntityA.EntityB और EntityB.PreferredEntityA एक ही रिश्ते से संबंधित हैं और एक-दूसरे के व्यस्त नेविगेशन गुण हैं। चूंकि दोनों नेविगेशन गुण संदर्भ हैं (संग्रह नहीं) ईएफ एक-से-एक रिश्ते का अनुमान लगाता है।

चूंकि आप वास्तव में दो से कई रिश्ते चाहते हैं तो आपको सम्मेलनों को ओवरराइड करना होगा। अपने मॉडल के साथ यह Fluent एपीआई के साथ ही संभव है:

modelBuilder.Entity<EntityA>() 
    .HasRequired(a => a.EntityB) 
    .WithMany() 
    .HasForeignKey(a => a.EntityBID); 

modelBuilder.Entity<EntityB>() 
    .HasOptional(b => b.PreferredEntityA) 
    .WithMany() 
    .HasForeignKey(b => b.PreferredEntityAID); 

(। आप इस का उपयोग करते हैं आप [ForeignKey] विशेषताओं को हटा सकते हैं)

आप एक मानचित्रण कि यह सुनिश्चित करेगी कि वरीय बच्चा हमेशा से एक है निर्दिष्ट नहीं कर सकते संबंधित बच्चे

आप Fluent एपीआई लेकिन केवल डेटा व्याख्या का उपयोग करना आप [InverseProperty] विशेषता का उपयोग करने के लिए EntityA.EntityBEntityB में एक संग्रह संपत्ति जोड़ने और इसे संबंधित कर सकते हैं नहीं करना चाहते हैं:

public class EntityB 
{ 
    public int ID { get; set; } 
    public Nullable<int> PreferredEntityAID { get; set; } 

    [ForeignKey("PreferredEntityAID")] 
    public virtual EntityA PreferredEntityA { get; set; } 

    [InverseProperty("EntityB")] // <- Navigation property name in EntityA 
    public virtual ICollection<EntityA> EntityAs { get; set; } 
} 
+2

में पॉप्युलेट करना भूल गया था। धन्यवाद। – lintmouse

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