Отношение один к одному или один в ASP.NET MVC EF Code First - PullRequest
0 голосов
/ 14 февраля 2012

Я новичок в .NET MVC и пытаюсь использовать Code First с существующей базой данных, в которой таблица имеет отношение один к одному или один (1 -> 0..1).

У меня есть отчет, который может иметь много разделов, и у каждого раздела может быть много вопросов.Вот немного того, что мне кажется, что у меня проблемы ... на каждый вопрос может быть один ответ или нет.

Я получаю следующую ошибку:

Система.Data.Edm.EdmAssociationEnd:: Кратность недопустима в роли 'QuestionAnswer_Question_Source' в отношении 'QuestionAnswer_Question'.Поскольку свойства зависимой роли не являются ключевыми свойствами, верхняя граница кратности зависимой роли должна быть � * �.

Вот мои классы моделей:

ModeratorReport.cs

public class ModeratorReport
{
    [Key, Column(Order = 0)]
    public int ModeratorReportID { get; set; }

    [Key, Column(Order = 1)]
    public string Status { get; set; }

    public string FileYear { get; set; }
    public string SessionCode { get; set; }
    public string CentreNumber { get; set; }
    public string SubjectNumber { get; set; }
    public string PaperNumber { get; set; }
    public string ModeratorNumber { get; set; }
    public DateTime? DateModified { get; set; }

    public virtual ICollection<AuditItem> Audit { get; set; }
}

Section.cs

public class Section
{
    [Key]
    public int SectionID { get; set; }
    public string SectionEnglish { get; set; }
    public string SectionWelsh { get; set; }

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

Question.cs

public class Question
{
    [Key]
    public int QuestionID { get; set; }

    [ForeignKey("Section")]
    public int SectionID { get; set; }

    public string QuestionEnglish { get; set; }
    public string QuestionWelsh { get; set; }
    public string Type { get; set; }

    public virtual Section Section { get; set; }
    public virtual QuestionAnswer QuestionAnswer { get; set; }
}

QuestionAnswer.cs

public class QuestionAnswer
{
    [Key]
    public int AnswerID { get; set; }

    [ForeignKey("ModeratorReport"), Column(Order = 0)]
    public int ModeratorReportID { get; set; }
    [ForeignKey("ModeratorReport"), Column(Order = 1)]
    public string Status { get; set; }

    [ForeignKey("Section")]
    public int SectionID { get; set; }

    [ForeignKey("Question")]
    public int QuestionID { get; set; }

    public string Answer { get; set; }

    public virtual ModeratorReport ModeratorReport { get; set; }
    public virtual Section Section { get; set; }
    public virtual Question Question { get; set; }
}

У меня также есть отношения один-ко-многим с ModeratorReport и Audit, но я не думаю, что это является причиной ошибки.

Буду признателен за любую помощь.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 14 февраля 2012

EF жалуется, потому что звучит так, как будто вы используете Ассоциацию FK - это означает, что QuestionID является собственностью сущности, а также имеется ссылка на Вопрос - и вы не можете сделать это с Ассоциациями FK.если вы удалите QuestionID из QuestionAnswer, это должно сработать

public class QuestionAnswer
{
    [Key,ForeignKey("Question")]]
    public int AnswerID { get; set; }

    [ForeignKey("ModeratorReport"), Column(Order = 0)]
    public int ModeratorReportID { get; set; }
    [ForeignKey("ModeratorReport"), Column(Order = 1)]
    public string Status { get; set; }

    [ForeignKey("Section")]
    public int SectionID { get; set; }


    public string Answer { get; set; }

    public virtual ModeratorReport ModeratorReport { get; set; }
    public virtual Section Section { get; set; }
    public virtual Question Question { get; set; }
}

Я бы предложил вам использовать свободное отображение, которое более понятно:

modelBuilder.Entity<Question>()
            .HasOptional(q => q.QuestionAnswer)

modelBuilder.Entity<QuestionAnswer>()
                .HasRequired(qa => qa.Question)
1 голос
/ 14 февраля 2012

Да, вы должны удалить QuestionId из объекта «Ответ», чтобы заставить его работать. Свободная конфигурация тогда будет:

modelBuilder.Entity<Question>()
            .HasOptional(qa => qa.QuestionAnswer)

Кроме того, если вы хотите использовать свойство навигации в Ответе для получения соответствующего вопроса, я думаю, что ответ не должен существовать без вопроса. Затем вы можете принудительно установить идентификатор ответа как PK, так и FK с помощью QuestionId. Добавьте это к конфигурации Ответа:

modelBuilder.Entity<QuestionAnswer>()
                .HasRequired(qa => qa.Question)
...