2012-04-14 47 views
6

मेरे पास चार इकाइयां हैं जिन्हें मैं पहले फ्लेंट एपीआई के माध्यम से डेटाबेस टेबल में अनुवाद करना चाहता हूं (मैं डेटाबेसanswers.org पर मिले मॉडल का उपयोग कर रहा हूं), लेकिन मैं हूं कैसे निश्चित नहीं है। मेरी समस्या यह है कि सुझाए गए मेन्यूआईडी को एक समग्र कुंजी (मेनूकोर्स और कोर्स रेसिपी चॉइस) में दो अलग-अलग तालिकाओं में माइग्रेट किया जा रहा है।कोड फर्स्ट फ्लुएंट एपीआई और नेविगेशन प्रॉपर्टीज में शामिल हों तालिका

यहाँ संदेश मैं हो रही है:

"एक या अधिक सत्यापन त्रुटियों मॉडल पीढ़ी के दौरान पाया गया:

\ tSystem.Data.Entity.Edm.EdmAssociationConstraint: में प्रॉपर्टी की संख्या रिश्ते की बाधा में आश्रित और प्रिंसिपल भूमिकाएं समान होंगी। "

यहाँ क्या मैं अपने EntityTypeConfiguration कक्षा में की कोशिश की है और यह स्पष्ट रूप से गलत है ...

public class CourseRecipeChoiceConfiguration : EntityTypeConfiguration<CourseRecipeChoice> 
{ 
    public CourseRecipeChoiceConfiguration() 
    { 
     HasKey(crc => new { crc.Id}); 
     HasRequired(r => r.Recipe).WithMany(crc => crc.CourseRecipeChoices).HasForeignKey(crc => crc.RecipeId); 
     HasRequired(m => m.MenuCourse).WithMany(crc => crc.CourseRecipeChoices).HasForeignKey(crc => crc.MenuCourseId); 
     HasRequired(m => m.MenuCourse).WithMany(crc => crc.CourseRecipeChoices).HasForeignKey(crc => crc.SuggestedMenu_MenuCourseId); 
    } 
} 

नेविगेशन गुण के लिए सही सिंटैक्स और CourseRecipeChoice के लिए धाराप्रवाह API सिंटैक्स के लिए सही सिंटैक्स क्या है तालिका में शामिल होने के ?

public class SuggestedMenu 
{ 
    public int SuggestedMenuId { get; set; } 

    public virtual ICollection<MenuCourse> MenuCourses { get; set; } 
} 

public class MenuCourse 
{ 
    public int Id { get; set; } 
    public int SuggestedMenuId { get; set; } 

    public SuggestedMenu SuggestedMenu { get; set; } 
    public virtual ICollection<CourseRecipeChoice> CourseRecipeChoices { get; set; } 
} 

public class CourseRecipeChoice 
{ 
    public int SuggestedMenuId { get; set; } 
    public int MenuCourseId { get; set; } 
    public int Id { get; set; } 
    public int RecipeId { get; set; } 

    //How do I represent the navigation properties in this class? 

} 

public class Recipe 
{ 
    public int RecipeId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

    public ICollection<CourseRecipeChoice> CourseRecipeChoices { get; set; } 
} 

कुंजी इस प्रकार हैं:

  • SuggestedMenu (आईडी)
  • MenuCourse (क्रमांक, SuggestedMenuId)
  • CourseRecipeChoice (क्रमांक, SuggestedMenuId, MenuCourseId, RecipeId) // यह वास्तव में है जहां मैं उलझन में हूं क्योंकि मॉडल के अनुसार, सुझाए गए मेन्यूआईड सुझाए गए एम में एक पीके है enu और MenuCourse और CourseRecipeChoice में एक पीएफ (यह सिर्फ बुरा डिजाइन हो सकता है?)
  • पकाने की विधि (RecipeId)
+0

क्या आप बस मुझे बता सकते हैं कि प्रत्येक तालिका के लिए कुंजी क्या हैं और विदेशी कुंजी क्या हैं, मैं अनुमान लगा रहा हूं लेकिन सुनिश्चित नहीं हूं। मुझे लगता है कि कोई बड़ा मुद्दा नहीं होना चाहिए। – NSGaga

+0

@NSGaga मैंने अभी तक आपकी प्रतिक्रिया को पढ़ना नहीं है, लेकिन मैंने चाबियाँ जोड़ने के लिए प्रश्न अपडेट किया है ... – Robert

उत्तर

15

... हाथ में जानकारी के आधार पर (चाबियाँ, रिश्ते नहीं पूरी तरह से स्पष्ट कर रहे हैं) ,
यहाँ सबसे जटिल परिदृश्य

public class SuggestedMenu 
{ 
    public int SuggestedMenuId { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<MenuCourse> MenuCourses { get; set; } 
    // public virtual ICollection<CourseRecipeChoice> CourseRecipeChoices { get; set; } 
} 
public class MenuCourse 
{ 
    public int MenuCourseId { get; set; } 
    public int SuggestedMenuId { get; set; } 
    public SuggestedMenu SuggestedMenu { get; set; } 
    public virtual ICollection<CourseRecipeChoice> CourseRecipeChoices { get; set; } 
} 
public class CourseRecipeChoice 
{ 
    public int CourseRecipeChoiceId { get; set; } 
    public int MenuCourseId { get; set; } 
    public int SuggestedMenuId { get; set; } 
    public int RecipeId { get; set; } 
    // no virtuals if required, non-optional 
    public Recipe Recipe { get; set; } 
    public MenuCourse MenuCourse { get; set; } 
    // public SuggestedMenu SuggestedMenu { get; set; } 
} 
public class Recipe 
{ 
    public int RecipeId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<CourseRecipeChoice> CourseRecipeChoices { get; set; } 
} 

है और कवर करना चाहिए कि तुम क्या मुझे लगता है कि हो सकता है ... ... और OnModelCreating में (मैं यह सब config वहाँ किया पसंद करते हैं, हालांकि यह एक ही है) ..

modelBuilder.Entity<CourseRecipeChoice>() 
    .HasKey(crc => new { crc.CourseRecipeChoiceId, crc.SuggestedMenuId, crc.MenuCourseId, crc.RecipeId }); 

modelBuilder.Entity<CourseRecipeChoice>() 
    .HasRequired(r => r.Recipe) 
    .WithMany(crc => crc.CourseRecipeChoices) 
    .HasForeignKey(crc => crc.RecipeId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<CourseRecipeChoice>() 
    .HasRequired(m => m.MenuCourse) 
    .WithMany(crc => crc.CourseRecipeChoices) 
    .HasForeignKey(crc => new { crc.MenuCourseId, crc.SuggestedMenuId }) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<SuggestedMenu>() 
    .HasKey(crc => crc.SuggestedMenuId); 

modelBuilder.Entity<MenuCourse>() 
    .HasKey(crc => new { crc.MenuCourseId, crc.SuggestedMenuId }); 

modelBuilder.Entity<MenuCourse>() 
    .HasRequired(m => m.SuggestedMenu) 
    .WithMany(crc => crc.MenuCourses) 
    .HasForeignKey(crc => crc.SuggestedMenuId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<Recipe>() 
    .HasKey(crc => crc.RecipeId); 

... और उदाहरण के लिए परीक्षण कुछ ...

 using (var db = new YourDbContext()) 
     { 
      SuggestedMenu suggestedmenu = new SuggestedMenu { Description = "suggested menu" }; 
      var menucourse = new MenuCourse { MenuCourseId = 2, SuggestedMenu = suggestedmenu }; 
      var recipe = new Recipe { Name = "My recipe", Description = "recipe desc" }; 
      var crc = new CourseRecipeChoice { CourseRecipeChoiceId = 2, MenuCourse = menucourse, Recipe = recipe, }; 
      db.CourseRecipeChoices.Add(crc); 
      int recordsAffected = db.SaveChanges(); 
      foreach (var crcs in db.CourseRecipeChoices.Include(c => c.MenuCourse).Include(c => c.Recipe)) 
      { 
       Console.WriteLine("{0}, {1}, {2}, {3}", crcs.MenuCourse.MenuCourseId, crcs.MenuCourse.SuggestedMenuId, crcs.Recipe.Name, crcs.Recipe.Description); 
      } 
     } 
+0

मैं इसे एक शॉट दूंगा और वापस एएसएपी रिपोर्ट करूंगा। – Robert

+0

यह पूरी तरह से काम किया! आज कुछ नया सीखने में मेरी मदद करने के लिए धन्यवाद! – Robert

+0

एनपी अगर हल किया गया है तो आप उत्तर को चिह्नित/अपवर्तित कर सकते हैं, सर्वोत्तम – NSGaga