Código de marco de entidades Primeras asignaciones múltiples de un tipo de entidad dentro de otro tipo de entidad

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

Pregunta

Estoy trabajando en un primer proyecto de código de marco de entidades y que tiene algunos problemas creando asignaciones. Un poco de fondo:

La base de datos se utilizará para una demostración de encuesta en línea. A los efectos de esta pregunta, es útil saber que tenemos las entidades de preguntas y cuestionarias. Sobre la entidad de la pregunta, necesitamos conocer primero las cuestionarias disponibles para la pregunta de currrent. En segundo lugar, nos gustaría saber si hay una pregunta de requisito previo y luego, si existe, si hay que saber cuáles son las cuestionarias aceptables de la pregunta pre-req que permiten que esta pregunta se muestre u oculta.

Esperemos que esto tenga sentido, pero pondré un código simulado para que puedas ver más o menos lo que tenemos hasta ahora.

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

Al intentar crear la migración después de hacerlo, obtenemos el siguiente error:

Esquema especificado no es válido. Errores: la relación 'xyz.database.quesion_availablequestionAnsweroptions' no se cargó porque el tipo 'xyz.database.questionansweroption' no está disponible.

Sin embargo, si comentamos fuera de las 2 llamadas de ModelBuilder.Entity <>, la migración se ejecuta sin problemas. ¿Hay alguna manera de hacer que ambos trabajen al mismo tiempo? O lo que es más importante, ¿existe una mejor manera de hacer lo que estamos tratando de hacer con el código de EF primero?

gracias

¿Fue útil?

Solución

Pude resolver esto después de dormir en él.Por lo tanto, para cualquier otra persona que se encuentre en una situación similar aquí está el nuevo 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");
        });
}

Esto me consiguió los resultados que estaba buscando, aunque todavía estoy interesado en saber si hay una mejor manera de hacer esto?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top