ASP.NET MVC EF Code First中的一对一或非一对一关系

时间:2012-02-14 16:06:32

标签: c# entity-framework ef-code-first

我是.NET MVC的新手,我正在努力将Code First与现有数据库结合使用,其中一个表具有一对一或一对(1 - > 0..1)的关系。 / p>

我有一份报告,可以有很多部分,每个部分都有很多问题。现在,我认为我遇到了麻烦...每个问题可能有一个答案或没有答案。

我收到以下错误:

  

System.Data.Edm.EdmAssociationEnd :: Multiplicity在Role中无效   关系中的'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 个答案:

答案 0 :(得分:5)

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 :(得分:1)

是的,你应该从Answer实体中删除QuestionId以使其工作。 流畅的配置将是:

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

此外,如果你想在答案上使用导航属性来检索相应的问题,我想如果没有问题,答案就不应该存在。然后,您可以使用QuestionId将答案的Id强制为PK和FK。 将其添加到答案的配置中:

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