Codice del framework di entità Prima mappature multiple di un tipo di entità all'interno di un altro tipo di entità

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

Domanda

Sto lavorando a un progetto Entity Framework Code First e riscontro alcuni problemi nella creazione di mappature.Un po' di background:

Il database verrà utilizzato per una demo del sondaggio online.Ai fini di questa domanda, è utile sapere che abbiamo entità Question e QuestionAnswerOption.Nell'entità domanda dobbiamo prima conoscere le QuestionAnswerOptions disponibili per la domanda corrente.In secondo luogo, vorremmo sapere se esiste una domanda prerequisita e, in tal caso, dobbiamo sapere quali sono le opzioni QuestionAnswerOptions accettabili dalla domanda pre-req che consentono di visualizzare o nascondere questa domanda.

Spero che questo abbia senso, ma inserirò del codice fittizio in modo che tu possa vedere più o meno ciò che abbiamo ottenuto finora.

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");
        });
}

Quando si tenta di creare la migrazione dopo aver eseguito questa operazione, viene visualizzato il seguente errore:

Lo schema specificato non è valido.Errori:La relazione "XYZ.Database.Question_AvailableQuestionAnswerOptions" non è stata caricata perché il tipo "XYZ.Database.QuestionAnswerOptions" non è disponibile.

Tuttavia, se commentiamo una delle 2 chiamate modelBuilder.Entity<>, la migrazione viene eseguita senza problemi.C'è un modo per far funzionare entrambi contemporaneamente?O, cosa ancora più importante, esiste un modo migliore per fare ciò che stiamo cercando di fare con EF Code First?

Grazie

È stato utile?

Soluzione

Sono riuscito a capirlo dopo averci dormito sopra.Quindi, per chiunque altro si trovi in ​​una situazione simile, ecco il nuovo codice.

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

Questo mi ha dato i risultati che stavo cercando, anche se sono ancora interessato a sapere se esiste un modo migliore per farlo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top