我正在尝试通过解决我自己设计的小任务来学习如何使用我自己的实体框架(Code First方法)。
为了解我的问题,你必须熟悉我提到的任务的内容,所以我将在下面的部分中提供相关信息。
我为小测验发明了以下数据模型:
我坚持实施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; }
}
在写这篇文章的过程中,我正在使用谷歌尽可能多地学习解决我的问题。如果我取得任何进展,我会相应地更新这篇文章。
如果这些问题对经验丰富的人来说听起来微不足道,我深表歉意。我刚刚开始使用C#和Entity框架,并且迫不及待想要编写任何有效的东西。我希望你们都可以联系。感谢您的理解。
答案 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属性,可以轻松创建一对多导航。
请注意,此模型通过设计强制执行只有一个问题是正确的事实。至于其他限制,它听起来像业务逻辑规则,而不是你应该强制执行数据层的事情。