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

时间:2016-06-28 19:07:34

标签: c# entity-framework-6

引言

我正在尝试通过解决我自己设计的小任务来学习如何使用我自己的实体框架(Code First方法)。

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

相关信息:

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

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

问题:

我坚持实施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框架,并且迫不及待想要编写任何有效的东西。我希望你们都可以联系。感谢您的理解。

    1 个答案:

    答案 0 :(得分:4)

    至于导航属性,这里有一些东西可以让你入手(让我知道是否有我遗漏的东西):

    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属性,可以轻松创建一对多导航。

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