所描述的数据模型的导航属性的实现

本文关键字:属性 实现 导航 数据模型 描述 | 更新日期: 2023-09-27 17:53:00

简介

我正在尝试通过解决我自己设计的一个小任务来学习如何使用实体框架(代码优先方法(。

为了理解我的问题,你必须熟悉我提到的任务的内容,所以我将在下面的部分提供相关信息。

相关信息:

我为一个小测验发明了以下数据模型:

  • 每位玩家回答10个问题
  • 每个问题有3个可能的答案,用户选择一个(例如,通过单击单选按钮(
  • 只有一个答案是正确的,另外两个是错误的

问题:

我在实施POCO时遇到了困难,所以我需要你关于如何正确实施它们的建议。

我相信我做得很好,我的主要问题是实现导航属性。

我为解决这个问题所做的努力:

我没有什么可展示的。尽管如此,我的习惯是总是展示我所拥有的一切,以减轻社区的任务。

因此,这些是我未完成的POCO:

public class Answer
{
    public int AnswerId { get; set; }
    public string TextOfTheAnswer { get; set; }
}
public class Question
{
    public int QuestionId { get; set; }
    public string TextOfTheQuestion { get; set; }
}
public class Player
{
    public int PlayerId { get; set; }
    public string Name { get; set; }
}

在写这篇文章的过程中,我使用谷歌尽可能多地学习来解决我的问题。如果我有任何进展,我会相应地更新这篇文章。

问题:

  • 我应该如何实现导航属性来镜像数据模型中的关系
  • 此外,我有没有办法执行一些强加的限制(每个问题有3个选项;玩家回答10个不同的问题;只有一个答案是问题的正确答案;等等…(
  • 如果这些问题对有经验的人来说听起来微不足道,我深表歉意。我刚开始使用C#和Entity框架,迫不及待地想写任何有效的东西。我希望你们都能感同身受。感谢您的理解

    所描述的数据模型的导航属性的实现

    至于导航属性,这里有一些东西可以让你开始(如果我错过了什么,请告诉我(:

    public class Answer
    {
      [Key]
      public int AnswerId { get; set; }
      public string TextOfTheAnswer { get; set; }
      public int QuestionId{get;set;}
      [ForeignKey(nameof(QuestionId))]
      public virtual Question Question{get;set;}
    }
    public class Question
    {
      [Key]
      public int QuestionId { get; set; }
      public string TextOfTheQuestion { get; set; }
      public virtual ICollection<Answer> Answers{get;set;}
      public int CorrectAnswerId{get;set;}
      [ForeignKey(nameof(CorrectAnswerId))]
      public virtual Answer CorrectAnswer{get;set;}
    }
    
    public class SessionQuestion
    {
      [Key]
      public int SessionQuestionId { get; set; }
      public int QuestionId{get;set;}
      [ForeignKey(nameof(QuestionId))]
      public virtual Question Question{get;set;}
      public int PlayerAnswerId{get;set;}
      [ForeignKey(nameof(PlayerAnswerId))]
      public virtual Answer PlayerAnswer{get;set;}
      public int TriviaSessionId { get; set; }
      [ForeignKey(nameof(TriviaSessionId))]
      public virtual TriviaSession TriviaSession{ get; set; }
    }
    public class TriviaSession
    {
      [Key]
      public int SessionId { get; set; }
      public int PlayerId { get; set; }
      [ForeignKey(nameof(PlayerId))]
      public virtual Player Player{ get; set; }
      public virtual ICollection<SessionQuestion> SessionQuestions{get;set;}
    }
    public class Player
    {
        [Key]
        public int PlayerId { get; set; }
        public string Name { get; set; }
        public virtual ICollection<TriviaSession> TriviaSessions{get;set;}
    }
    

    基本上,EF在运行时创建类的子类,因此将导航属性保留为虚拟属性可以让EF类覆盖它们,并根据属性中的键获取引用,该键的名称是传递给ForeignKey属性构造函数的字符串(很难理解,是吗?(。

    通过声明虚拟通用ICollection属性,可以轻松创建一对多导航。

    请注意,这个模型强化了这样一个事实,即只有一个问题是正确的——通过设计。至于其他限制,听起来像是业务逻辑规则,而不是数据层应该强制执行的规则。