EF 6.1 Code First — количество указанных столбцов должно совпадать с количеством столбцов первичного ключа.

Я столкнулся со следующей ошибкой при попытке перенести базу данных в Entity Framework.

Указанные столбцы внешнего ключа ассоциации «question_set_id» недействительны. Количество указанных столбцов должно совпадать с количеством столбцов первичного ключа.

Я удалил исходный первичный ключ QuestionSetId и создал отношение составного ключа. Столбцы в отношении составного ключа также сопоставляются с внешними ключами. Я не уверен, в чем проблема.

Вот связанный объект.

public class QuestionSet
{
    [Key, Column(Order = 1)]
    public long TitleId { get; set; }

    [ForeignKey("TitleId")]
    public virtual Title Title { get; set; }

    [Key, Column(Order = 0)]
    public long ReviewCycleId { get; set; }

    [ForeignKey("ReviewCycleId")]
    public virtual ReviewCycle ReviewCycle { get; set; }

    public virtual List<Question> Questions { get; set; }
}

DbContext имеет:

    modelBuilder.Entity<QuestionSet>()
            .HasMany(c => c.Questions)
            .WithMany(c => c.QuestionSets)
                .Map(x => x.ToTable("QUESTION_SET_QUESTION")
                    .MapLeftKey("question_set_id")
                    .MapRightKey("question_id"))
        ;

person Sigotron    schedule 08.09.2014    source источник
comment
Мне кажется, что ошибка генерируется Question Entity. Этот объект должен иметь составной внешний ключ для QuestionSet. Кажется, что Question имеет question_set_id в качестве внешнего ключа для своего QuestionSetхотя.   -  person Dabblernl    schedule 08.09.2014
comment
Спасибо, я рассмотрю эту возможность. Я обнаружил некоторые другие проблемы из-за того, что это отношения «многие ко многим». Я отредактирую свой пост с дополнительной информацией после того, как изучу его подробнее.   -  person Sigotron    schedule 09.09.2014
comment
Вот и все: QuestionSet имеет составной первичный ключ, и вы указываете один внешний ключ в своем свободном коде API для соединительной таблицы Question_Set_Question.   -  person Dabblernl    schedule 09.09.2014


Ответы (1)


QuestionSet имеет два ключа, но MapLeftKey из QuestionSet указывает только один ключ.

MapLeftKey("question_set_id")

Замените его чем-то вроде этого:

MapLeftKey(new []{ "question_set_review_cycle_id", "question_set_title_id" })

Первый ключ — ReviewCycleId (порядок столбца 0), второй ключ — TitleId (порядок столбца 1).

Это должно решить проблему, если только у Question тоже нет двух ключей.

person Yuliam Chandra    schedule 08.09.2014
comment
Спасибо, это было полезно и действительно решило проблему! - person Sigotron; 09.09.2014