C# ASP.NET MVC EF代码中的一对一或一关系优先

C# ASP.NET MVC EF代码中的一对一或一关系优先,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我是.NETMVC新手,我正在努力首先对现有数据库使用代码,其中表具有一对一或一(1->0..1)关系 我有一份报告,可以有很多部分,每个部分都有很多问题。现在我想我遇到麻烦了。。。每个问题可能有一个答案,也可能没有答案 我得到以下错误: System.Data.Edm.EdmAssociationId::多重性在角色中无效 关系中的“问题答案\问题来源” “问题-回答-问题”。因为依赖角色属性是 不是键属性,而是 从属角色必须是�*�. 以下是我的模型课程: 主持人报告.cs public c

我是.NETMVC新手,我正在努力首先对现有数据库使用代码,其中表具有一对一或一(1->0..1)关系

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

我得到以下错误:

System.Data.Edm.EdmAssociationId::多重性在角色中无效 关系中的“问题答案\问题来源” “问题-回答-问题”。因为依赖角色属性是 不是键属性,而是 从属角色必须是�*�.

以下是我的模型课程:

主持人报告.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; }
}
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; }
}
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; }
}
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; }
}
问题答案.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; }
}
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; }
}
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; }
}
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; }
}
我还与版主报告和审计有一对多的关系,但我不认为这是导致错误的原因

任何帮助都将不胜感激


谢谢。

EF在抱怨,因为听起来你在使用FK关联-这意味着QuestionID是实体的属性,并且还有一个问题引用-你不能用FK关联来做这件事。 如果您从
questionresponse
中删除
QuestionID
,它应该可以工作

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; }
}
我建议您使用更清晰的fluent映射:

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

modelBuilder.Entity<QuestionAnswer>()
                .HasRequired(qa => qa.Question)
modelBuilder.Entity()
.has可选(q=>q.QuestionAnswer)
modelBuilder.Entity()
.HasRequired(qa=>qa.Question)

EF在抱怨,因为听起来你好像在使用FK关联——这意味着QuestionID是实体的一个属性,也有一个问题引用——而你不能使用FK关联。 如果您从
questionresponse
中删除
QuestionID
,它应该可以工作

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; }
}
我建议您使用更清晰的fluent映射:

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

modelBuilder.Entity<QuestionAnswer>()
                .HasRequired(qa => qa.Question)
modelBuilder.Entity()
.has可选(q=>q.QuestionAnswer)
modelBuilder.Entity()
.HasRequired(qa=>qa.Question)

是的,您应该从答案实体中删除QuestionId以使其正常工作。 然后,fluent配置将是:

modelBuilder.Entity<Question>()
            .HasOptional(qa => qa.QuestionAnswer)
modelBuilder.Entity()
.has可选(qa=>qa.QuestionAnswer)
另外,如果您想在答案上使用导航属性来检索相应的问题,我想答案不应该没有问题。然后,您可以使用问号将答案的Id强制为PK和FK。 将此添加到答案的配置中:

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

是的,您应该从答案实体中删除QuestionId以使其正常工作。 然后,fluent配置将是:

modelBuilder.Entity<Question>()
            .HasOptional(qa => qa.QuestionAnswer)
modelBuilder.Entity()
.has可选(qa=>qa.QuestionAnswer)
另外,如果您想在答案上使用导航属性来检索相应的问题,我想答案不应该没有问题。然后,您可以使用问号将答案的Id强制为PK和FK。 将此添加到答案的配置中:

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

感谢@Massimiliano的回复。唯一的问题是,我在QuestionAnswer中使用QuestionID来检索特定问题的答案,如果没有ID,我就不能这样做。除非我有别的办法?此外,我似乎还遇到了一个错误:
无法确定类型“Viewer.Models.QuestionAnswer”和“Viewer.Models.QuestionAnswer”之间关联的主端。必须使用relationship fluent API或数据批注显式配置此关联的主端。
非常感谢。我经常对fluentapi感到困惑,但现在我开始理解它了。早上来上班,马上就能开始工作,这真是太好了!:-)感谢回复@Massimiliano。唯一的问题是,我在QuestionAnswer中使用QuestionID来检索特定问题的答案,如果没有ID,我就不能这样做。除非我有别的办法?此外,我似乎还遇到了一个错误:
无法确定类型“Viewer.Models.QuestionAnswer”和“Viewer.Models.QuestionAnswer”之间关联的主端。必须使用relationship fluent API或数据批注显式配置此关联的主端。
非常感谢。我经常对fluentapi感到困惑,但现在我开始理解它了。早上来上班,马上就能开始工作,这真是太好了!:-)