Code First Fluent API и свойства навигации в соединительной таблице

У меня есть четыре сущности, которые я хотел бы преобразовать в таблицы базы данных с помощью свободного кода API (я использую модель, найденную на databaseanswers.org), но я не уверен, как именно. Проблема, с которой я сталкиваюсь, заключается в том, что с помощью метода AdditionalMenuId переносится по двум разным таблицам в комбинированном ключе (MenuCourse и CourseRecipeChoice).

Вот сообщение, которое я получаю:

& quot; Одна или несколько ошибок проверки были обнаружены во время генерации модели:

\ tSystem.Data.Entity.Edm.EdmAssociationConstraint:: количество свойств в зависимых и основных ролях в ограничении отношений должно быть одинаковым. & quot;

Вот то, что я пробовал в своем классе EntityTypeConfiguration, и это, очевидно, неверно ...

<code>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);
    }
}
</code>

Каков правильный синтаксис для свойств навигации и правильный синтаксис для свободного синтаксиса API для таблицы соединений CourseRecipeChoice?

<code>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; }
}
</code>

Ключи следующие:

SuggestedMenu(Id) MenuCourse(Id, SuggestedMenuId) CourseRecipeChoice(Id, SuggestedMenuId, MenuCourseId, RecipeId) //this is actually where I get confused because according to the model, SuggestedMenuId is a PK in SuggestedMenu and a PF in MenuCourse and CourseRecipeChoice (could this just be bad design?) Recipe(RecipeId)
 Robert14 апр. 2012 г., 20:43
@ NSGaga Я еще не прочитал ваш ответ, но обновил вопрос, добавив ключи ...
 NSGaga14 апр. 2012 г., 17:25
Не могли бы вы сказать мне, какие ключи для каждой таблицы и какие внешние ключи, я предполагаю, но не уверен. С не должно быть больших проблем, я думаю.

Ответы на вопрос(1)

Решение Вопроса

отношения не совсем понятны),
вот самый сложный сценарий и должен охватывать то, что у вас может быть, я думаю ...

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 (Я предпочитаю, чтобы все настройки были там выполнены, хотя это то же самое) ...

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);
            }
        }
 Robert14 апр. 2012 г., 21:08
Готово! Я вышел из своего офиса и вернулся, потому что я забыл это сделать :)
 14 апр. 2012 г., 21:04
NP, если это решено, вы можете пометить / ответить на вопрос, лучше всего
 Robert14 апр. 2012 г., 20:46
Я сделаю попытку и доложу как можно скорее.
 14 апр. 2012 г., 21:10
хорошо, спасибо - вы могли бы сделать это завтра :)
 Robert14 апр. 2012 г., 21:02
Работало отлично! Спасибо, что помогли мне узнать что-то новое сегодня!

Ваш ответ на вопрос