Рамный код объекта Первые множественные сопоставления одного типа объекта внутри другого типа объекта
-
21-12-2019 - |
Вопрос
Я работаю над структурой объекта 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");
});
}
.
Это получил мне результаты, которые я искал, хотя мне все еще интересно узнать, есть ли лучший способ сделать это?