我是Entity Framework代码优先的新手.这是我在ASP.NET MVC中的学习,使用代码优先创建数据库.
我有两节课:
public class Student { public int StudentId { get; set; } public string Name { get; set; } public int Standard { get; set; } public int SubjectId { get; set; } [ForeignKey("SubjectId")] public ICollection<Subject> Subjects { get; set; } } public class Subject { [Key] public int SubjectId{ get; set; } public string SubjectName { get; set; } }
我正在尝试将Student记录插入Student表中,该表具有引用Subject表的外键SubjectId.
我正在尝试两种可能的方式:
第一种方法
using(var cxt = new SchoolContext()) { Subject sub = new Subject() { SubjectId = 202,SubjectName ="Geology" }; Student stu = new Student() { Name = "Riya",SubjectId = 202 }; cxt.Subjects.Add(sub); cxt.Students.Add(stu); cxt.SaveChanges(); }
在这里,我创建了一个新的Subject实例,其SubjectId = 202.现在,当我创建Student对象并将值202分配给SubjectId时,存在Insert语句冲突.虽然主题为SubjectId = 202,但为什么会出现插入冲突?当我调试时,我看到导航属性Subjects在这里为null.我不明白这一点.
第二种方法:
using( var cxt=new SchoolContext()) { Student stu = new Student() { Name = "Riya" }; Subject sub = new Subject() { SubjectId = 202,SubjectName = "Geology" }; stu.Subjects.Add(sub); cxt.Students.Add(stu); cxt.SaveChanges(); }
但我得到一个空引用异常
Object Reference not set to instance of an Object
为什么这里的stu.Subjects为null?
所以我的问题是:
> Student Class中的SubjectId是什么意思?即它的价值与什么有关?我们可以明确设置它,如果是,它会引用Subject表的主键吗?如果不是,是否仅为EF代码约定指定了它?
>同样:导航属性的作用是什么?为什么它为null并且何时不为null?
我对导航属性的基本理解是它用于使EF确定两个实体之间的关系.
任何人都可以用一些例子来澄清一下,我们将不胜感激.
解决方法
你基本上都是在你的方法中创建一个新的学生和一个新的主题.但根据我的理解,你真正要做的是创建一个新的学生,并为其分配一个现有的主题(SubjectId = 202) – 对吗?
您的学生班级中的SubjectId在此设置中完全没有意义 – 因为您在学生和主题之间有1:n的关系.您需要使用该ICollection< Subject>处理这名学生注册的0:n科目.
为此 – 使用此代码:
using(var ctx = new SchoolContext()) { // create the *NEW* Student Student stu = new Student() { Name = "Riya" }; // get existing subject with Id=202 Subject sub = ctx.Subjects.FirstOrDefault(s => s.SubjectId == 202); // Add this existing subject to the new student's "Subjects" collection stu.Subjects.Add(sub); // Add the new student to the context,and save it all. ctx.Students.Add(stu); ctx.SaveChanges(); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。