Entity Framework Code Premier plusieurs mappages multiples d'une entité de type à l'intérieur d'un autre type d'entité

StackOverflow https://stackoverflow.com//questions/20014656

Question

Je travaille sur un premier projet de code-cadre d'entité et j'ai des problèmes de création de mappages. Un petit fond:

La base de données sera utilisée pour une démonstration de sondage en ligne. Aux fins de cette question, il est utile de savoir que nous avons des questions de questions et de questionnements. Sur l'entité de la question, nous devons d'abord connaître les interrogateurs disponibles pour la question current. Deuxièmement, nous aimerions savoir s'il y a une question préalable requise, puis si nous avons besoin de savoir quelles sont les interrogateurs acceptables de la question pré-req qui permettent à cette question d'être affichée ou cachée.

Espérons que cela a du sens, mais je vais mettre un peu de code simulé afin que vous puissiez voir à peu près ce que nous avons jusqu'à présent.

public class Question
{
    public virtual List<QuestionAnswerOption> AvailableQuestionAnswerOptions { get; set; }
    public Question RequiredPrerequisiteQuestion { get; set; }
    public virtual List<QuestionAnswerOption> AcceptablePrerequisiteQuestionAnswerOptions { get; set; }
}

public class QuestionAnswerOption
{
    public int Index { get;set; }
    public string Value { get;set; } // this may be 'Yes', 'No', 'Maybe', 'Don't Know', etc.
    public virtual List<Question> Questions { get; set; }
}

// then inside of our database context class we have the following
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    modelBuilder.Entity<Question>().HasMany(x =>
        x.AvailableQuestionAnswerOptions).WithMany(y => y.Questions)
        .Map(m =>
        {
            m.MapLeftKey("Question_ID");
            m.MapRightKey("QuestionAnswerOption_ID");
            m.ToTable("AvailableQuestionAnswerOptionMap");
        });

    modelBuilder.Entity<Question>().HasMany(x =>
        x.AcceptablePrerequisiteQuestionAnswerOptions).WithMany(y => y.Questions)
        .Map(m =>
        {
            m.MapLeftKey("Question_ID");
            m.MapRightKey("QuestionAnswerOption_ID");
            m.ToTable("AcceptableQuestionAnswerOptionMap");
        });
}

Lorsque vous essayez de créer la migration après cela, nous obtenons l'erreur suivante:

Schéma spécifié n'est pas valide. Erreurs: la relation 'xyz.database.Question_availableQuestionSwerOptions' n'a pas été chargée car le type 'xyz.database.Questionansweroption' n'est pas disponible.

Toutefois, si nous commencions l'un ou l'autre des 2 appels <> appels que la migration passe en douceur. Existe-t-il un moyen de faire fonctionner les deux pour travailler en même temps? Ou plus important encore, y a-t-il une meilleure façon de faire ce que nous essayons de faire avec le code EF en premier?

merci

Était-ce utile?

La solution

J'ai pu comprendre cela après avoir dormi dessus.Donc, pour quelqu'un d'autre qui rencontre une situation similaire, voici le nouveau code.

// No change to this class
pubic class Question
{
    public virtual List<QuestionAnswerOption> AvailableQuestionAnswerOptions { get; set; }
    public Question RequiredPrerequisiteQuestion { get; set; }
    public virtual List<QuestionAnswerOption> AcceptablePrerequisiteQuestionAnswerOptions { get; set; }
}

// Added second collection of Question, PreRequisiteQuestions
public class QuestionAnswerOption
{
    public int Index { get;set; }
    public string Value { get;set; } // this may be 'Yes', 'No', 'Maybe', 'Don't Know', etc.
    public virtual List<Question> Questions { get; set; }
    public virtual List<Question> PreRequisiteQuestions { get; set; }
}

// then inside of our database context class we have the following
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    modelBuilder.Entity<Question>().HasMany(x =>
        x.AvailableQuestionAnswerOptions).WithMany(y => y.Questions)
        .Map(m =>
        {
            m.MapLeftKey("Question_ID");
            m.MapRightKey("QuestionAnswerOption_ID");
            m.ToTable("AvailableQuestionAnswerOptionMap");
        });

    // changed this to use the new PreRequisiteQuestions collection
    modelBuilder.Entity<Question>().HasMany(x =>
        x.AcceptablePrerequisiteQuestionAnswerOptions).WithMany(y => y.PreRequisiteQuestions )
        .Map(m =>
        {
            m.MapLeftKey("Question_ID");
            m.MapRightKey("QuestionAnswerOption_ID");
            m.ToTable("AcceptableQuestionAnswerOptionMap");
        });
}

Cela m'a obtenu les résultats que je cherchais, même si je suis toujours intéressé à savoir s'il y a une meilleure façon de le faire?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top