Pergunta

Eu estou trabalhando em um Code First do Entity Framework de projeto e de ter alguns problemas de criação de mapeamentos.Um pouco de história:

O banco de dados será usado para uma pesquisa on-line demo.Para os fins desta questão, é útil saber que temos Questão e QuestionAnswerOption entidades.Sobre a questão entidade precisamos primeiro saber o disponível QuestionAnswerOptions para o currrent questão.Segundo, gostaria de saber se existe um pré-requisito questão e, em seguida, se houver, precisamos saber quais são os aceitável QuestionAnswerOptions do pré-req pergunta que permitem que esta questão deve ser exibida ou ocultada.

Espero que isso faz sentido, mas eu vou colocar um pouco de código mock para que você possa ver muito bem o que temos até agora.

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 tentar criar a migração depois de fazer isso, temos o seguinte erro:

Esquema especificado não é válido.Erros:A relação 'XYZ.De banco de dados.Question_AvailableQuestionAnsweroptions' não foi carregado porque o tipo de 'XYZ.De banco de dados.QuestionAnswerOption' não está disponível.

No entanto, se nós comentário sem qualquer uma das 2 modelBuilder.Entidade<> chama a migração é executado através suavemente.Existe uma maneira de obter ambos para trabalhar ao mesmo tempo?Ou, mais importante, há uma melhor maneira de fazer o que nós estamos tentando fazer com a EF Code First?

Obrigado

Foi útil?

Solução

Eu era capaz de descobrir isso depois de dormir sobre ele.Assim, para alguém que é executado em uma situação semelhante aqui está o novo código.

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

Este obtive os resultados que eu estava procurando, apesar de eu ainda estou interessado em saber se há uma maneira melhor de fazer isso?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top