2012-06-06 6 views
12

मैं हाल ही में एंटिटी फ्रेमवर्क कोड फर्स्ट के साथ इस अजीब समस्या में आया था।मुझे एंटिटी फ्रेमवर्क कोड प्रथम विदेशी कुंजी विशेषताओं के साथ अतिरिक्त विदेशी कुंजी कॉलम क्यों मिल रहा है?

मेरी कक्षा इस

public class Status 
{ 
     [Key] 
     public int StatusID { get; set; }  
     public string Name { get; set; } 
     public int MemberID { get; set; } 

     [ForeignKey("MemberID")] 
     public virtual Member Member { get; set; }     

     public int PosterID { get; set; } 

     [ForeignKey("PosterID")] 
     public virtual Member Poster { get; set; }   

     public virtual ICollection<StatusLike> StatusLikes { get; set; }   
     public virtual ICollection<StatusComment> StatusComments { get; set; } 
} 

मेरे सदस्य वर्ग इस

public class Member 
    { 
     [Key] 
     public int MemberID { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Bio { get; set; } 

     public virtual ICollection<MemberCourseTaken> MemberCourseTakens { get; set; } 
     public virtual ICollection<Status> Statuses { get; set; } 
     public virtual ICollection<Club> FoundedClubs { get; set; } 

     public string EmailAddress { get; set; } 
     public string Password { get; set; } 
     public string Phone { get; set; } 

     public int AccountSourceID { get; set; } 
     public AccountSource AccountSource { get; set; } 

     public int AddressID { get; set; } 
     public Address Address { get; set; } 
     public string ProfilePhoto { get; set; } 

     public int MemberRankID { get; set; } 
     public MemberRank MemberRank { get; set; } 
     public DateTime Created { get; set; } 
     public DateTime Modified { get; set; } 
    } 

की तरह और जो भी कारण डेटाबेस तालिका कि बनाई गई है निम्न स्तंभ है के लिए लग रहा है की तरह लग रहा

StatusID 
Name 
MemberID 
PosterID 
Member_MemberID 

MemberID, PosterID, औरके साथविदेशी कुंजी होने के नाते।

मैं Member_MemberID कैसे उत्पन्न किया जा सकता है?

+1

आपके पास 'सदस्य' से' स्थिति' के कितने नेविगेशन गुण हैं? अपना 'सदस्य' वर्ग दिखाएं। –

+0

बहुत सारे! मैंने सदस्य वर्ग में प्रश्न में जोड़ा। –

उत्तर

8

Member.Statuses संपत्ति के कारण आपका Member_MemberID कॉलम बनाया गया है। मैं कल्पना कर सकता हूं कि यह वही नहीं है जो आप चाहते हैं। शायद सदस्यों और स्थितियों को एक-दूसरे से स्वतंत्र होना चाहिए, इसलिए आपको जंक्शन तालिका की आवश्यकता है।

मैं अगर आप पहले से DbContext की OnModelCreating ओवरराइड का उपयोग पता नहीं है, लेकिन यह है कि जगह सदस्य और स्थिति के बीच मानचित्रण बदल सकते हैं:

protected override void OnModelCreating(DbModelBuilder mb) 
{ 
    mb.Entity<Member>().HasMany(m => m.Statuses).WithMany(); 
} 

यह दो के साथ एक मेज MemberStatuses तालिका पैदा करेगा विदेशी कुंजी के रूप में आईडी कॉलम। यह एसोसिएशन के "अन्य" पक्ष पर नेविगेशन संपत्ति के बिना कई से कई रिश्तों को मॉडल करने का एक तरीका है। (मुझे नहीं लगता कि आप Members संपत्ति Status में चाहते हैं)।

+3

यहां कुछ और स्पष्टीकरण अच्छा होगा। मैं वास्तव में समझ में नहीं आता कि 2 से कई रिश्तों को 'सदस्य_MemberID' कॉलम क्यों बनाया जाना चाहिए। इसकी आवश्यकता क्यों है? – Jez

+1

@ जेज़ आप सही हैं, इसे थोड़ा बेहतर समझाया जा सकता है। 'सदस्य_MemberID' फ़ील्ड एफके के लिए एक-से-कई संबंध सदस्य-स्थितियों के लिए स्थिति है।यह बनाया गया है क्योंकि एसोसिएशन को 'सदस्य' या 'पोस्टर' के द्वि-दिशात्मक हिस्से के रूप में नहीं देखा जाता है। मेरे समाधान का मुद्दा यह था कि (आईएमओ) सदस्य और स्थिति काफी स्वतंत्र संस्थाएं हैं, ऑर्डर-ऑर्डरलाइन जैसी नहीं। –

+0

मुझे वास्तव में यह समझने में परेशानी हो रही है कि आप क्या कह रहे हैं, @GertArnold। "एसोसिएशन" क्या है? "द्वि-दिशात्मक भाग" क्या है? – Jez

0

मैंने इसे पहले देखा है। मेरे मामले में (एफई 6.1 का उपयोग करना), यह क्योंकि मेरे Fluent एपीआई मानचित्रण इतना की तरह स्थापित किया गया था था:

// In my EntityTypeConfiguration<Status> 
HasRequired(x => x.Member).WithMany().HasForeignKey(x => x.MemberID); 

कि कोड पूरी तरह से ठीक काम करता है, लेकिन यह एफई नहीं बताता है कि मेरे Member वर्ग के संग्रह नेविगेशनल संपत्ति Status हे खाते में लिया गया है। इसलिए, जब मैंने अपने Status कक्षा में Member नेविगेशन प्रॉपर्टी के अस्तित्व को स्पष्ट रूप से संभाला, तो अब मैंने एक अनाथ संबंधित संग्रह संपत्ति छोड़ी है। उस अनाथ संपत्ति, संग्रह होने के नाते, ईएफ को बताती है कि मेरी Status कक्षा में इसके लिए एक विदेशी कुंजी की आवश्यकता है। तो यह Status कक्षा पर बनाता है।

इसे ठीक करने के लिए, मुझे 100% स्पष्ट होना था।

HasRequired(x => x.Member).WithMany(x => x.Statuses).HasForeignKey(x => x.MemberID) 

यह मधुमक्खी सकता है कि Member में अपने Statuses संग्रह संपत्ति एक विशेषता यह कह रही है कि यह पहले से ही माना जाता है, और ऑटो बनाने मैपिंग नहीं जाना चाहिए। मुझे यह विशेषता नहीं है।

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