加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用ASP.NET MVC中的Entity Framework将记录插入带有

发布时间:2020-12-15 22:46:54 所属栏目:百科 来源:网络整理
导读:我是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 Subj
我是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();
}

这样做 – 将新学生插入到您的数据库表中,并建立学生与其科目之间的1:n关系.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读