Рамный код объекта Первые множественные сопоставления одного типа объекта внутри другого типа объекта

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

Вопрос

Я работаю над структурой объекта Framework первым проектом и имея некоторые проблемы со созданием сопоставлений. Немного фона:

База данных будет использоваться для демонстрации онлайн-опроса. Для целей этого вопроса полезно знать, что у нас есть вопрос и сомнительные объекты. На вопрос лицензию нам нужно сначала узнать имеющиеся вопросанвероптенции для вопроса для визуализации. Во-вторых, мы хотели бы знать, есть ли необходимый вопрос, а затем, если нам нужно знать, каковы приемлемые сомнительные ответы от вопроса председателя, которые позволяют отображать этот вопрос или скрывать.

Надеюсь, это имеет смысл, но я поставим немного кода издевательства, чтобы вы могли видеть в значительной степени то, что у нас до сих пор.

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

При попытке создать миграцию после этого, мы получим следующую ошибку:

Указанная схема недействительна. Ошибки: отношения Xyz.database.question_availablequestiveswweroptions 'не загружали, потому что тип' xyz.database.questionansweeroption не доступен.

Однако, если мы прокомментируем любой из 2 ModelBuilder.entity <> вызовы миграции проходит плавно. Есть ли способ получить оба их работать одновременно? Или предпочтительно, есть ли лучший способ сделать то, что мы пытаемся сделать с кодом EF?

Спасибо

Это было полезно?

Решение

Я смог понять это после сна на нем.Так что для кого-либо еще, что входит в подобную ситуацию, вот новый код.

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

Это получил мне результаты, которые я искал, хотя мне все еще интересно узнать, есть ли лучший способ сделать это?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top