2011-09-02 11 views
15

मैं दो संस्थाओं है एक रिश्ता है जिसके लिए मैं एक मेजएफई कोड पहले अतिरिक्त कॉलम में आदेश देने के उद्देश्य से

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Image> Images { get; set; } 
} 


public class Image 
{ 
    public int Id { get; set; } 
    public string Filename { get; set; } 

    public virtual ICollection<Student> Students { get; set; } 
} 


protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

     modelBuilder.Entity<Student>() 
      .HasMany(i => i.Images) 
      .WithMany(s => s.Students) 
      .Map(m => m.ToTable("StudentImages")); 
} 

में शामिल होने मैं के कालानुक्रमिक आदेश अनुमति देने के लिए एक अतिरिक्त स्तंभ जोड़ना चाहते हैं बनाने के लिए है कि तालिका में शामिल होने के StudentImages।

मुझे प्रासंगिक कोड कहां जोड़ना चाहिए?

उत्तर

24

क्या आप अपने आवेदन में उस नए कॉलम का उपयोग करना चाहते हैं? ऐसे मामले में आप अपने मॉडल के साथ ऐसा नहीं कर सकते हैं। कई से अधिक संबंध केवल तभी काम करते हैं जब जंक्शन तालिका में मुख्य सारणी के लिए विदेशी कुंजी की तुलना में कुछ और नहीं होता है। एक बार जब आप अपने आवेदन के लिए अतिरिक्त कॉलम जोड़ देते हैं, तो जंक्शन तालिका किसी अन्य के रूप में इकाई बन जाती है = आपको तीसरी कक्षा की आवश्यकता होती है। आपका मॉडल तरह दिखना चाहिए:

public class StudentImage 
{ 
    public int StudentId { get; set; } 
    public int ImageId { get; set; } 
    public int Order { get; set; } 
    public virtual Student Student { get; set; } 
    public virtual Image Image { get; set; } 
} 

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<StudentImage> Images { get; set; } 
} 


public class Image 
{ 
    public int Id { get; set; } 
    public string Filename { get; set; } 
    public virtual ICollection<StudentImage> Students { get; set; } 
} 

और अपने मानचित्रण के साथ-साथ परिवर्तन करना होगा:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<StudentImages>().HasKey(si => new { si.StudentId, si.ImageId }); 

    // The rest should not be needed - it should be done by conventions 
    modelBuilder.Entity<Student>() 
       .HasMany(s => s.Images) 
       .WithRequired(si => si.Student) 
       .HasForeignKey(si => si.StudentId); 
    modelBuilder.Entity<Image>() 
       .HasMany(s => s.Students) 
       .WithRequired(si => si.Image) 
       .HasForeignKey(si => si.ImageId); 
} 
+0

हममम, इसका मतलब है मैं मुझे आश्चर्य है कि Student.Images आदि तक पहुंच खो मैं मैं क्या है रख सकते जा रहा फिलहाल और एक अलग StudentImagesOrder इकाई बनाएं और कोड को पहले इसे बनाने दें और इस जानकारी को वहां स्टोर करें? –

+0

एक साल बाद भी यही समस्या है और यह खोजते समय Google पर शीर्ष हिट में से एक है - मुझे आश्चर्य है कि यह अभी भी वर्तमान कार्यान्वयन है कि अतिरिक्त कॉलम जोड़ने पर मैंने कई रिश्तों को खो दिया है। (इस मामले में student.images?) –

+0

@ s093294: हाँ स्थिति एक जैसी है और यह नहीं बदलेगी। यदि आप जंक्शन तालिका में नया कॉलम जोड़ते हैं तो आपको नए कॉलम तक पहुंचने के कई संबंधों के बजाय कई लोगों की बजाय एक नई इकाई की आवश्यकता होती है। –

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