实体框架 4,插入时外键值而不是 ID

本文关键字:键值 ID 框架 插入 实体 | 更新日期: 2023-09-27 17:57:38

敢肯定这是非常基本的问题,但现在让我感到困惑:S

我有 2 个表,具有外键约束的学生和课程,许多学生到 1 门课程。

我在学生表中存储了一个CourseId_FK引用,因此当我创建学生时,我该如何执行此类操作?

Students student = new Students();
student.Name = Bob;
student.Course.CourseName = "Geography";
db.SaveChanges();

现在,以上不起作用,我必须解决

student.CourseId = 22;

谁能帮我?

谢谢

大卫

实体框架 4,插入时外键值而不是 ID

如果您不想加载完整的课程实体:

Student student = new Student();
student.Name = Bob;
student.CourseId = db.Courses
                     .Where(c => c.CourseName == "Geography")
                     .Select(c => c.CourseId).First();
db.SaveChanges();

这只会从数据库中获取地理课程的Id(或者在没有任何地理课程时崩溃(。

查看您的实体,"学生"是否有"课程"(实际上:课程(属性?

对于您想要执行的操作,您的实体可能应该看起来像这样:

public class Student
{
    public string Name {get; set;}
    public virtual ICollection<Course> Courses {get; set;}
}

然后,您可以执行以下操作:

Student student = new Student();
student.Name = Bob;
student.Courses.Add(db.Courses.Where(c => c.CourseName == "Geography"));

编辑:如果学生只能有一门课程,您可以修改Student类,使其如下所示:

public class Student
{
    public int StudentId {get; set;}
    public string Name {get; set;}
    public int CourseId {get; set;}
    public virtual Course Course {get; set;}
}

然后你的代码看起来像这样:

student.Course = db.Courses.Where(c => c.CourseName == "Geography"));

您的代码(我期望(是你只有CourseId所以当你这样做时,你不能将实际的课程对象分配给你的学生。

我会做这样的事情:

Student student = new Student();
student.Name = Bob;
student.Course = db.Courses.First(c => c.CourseName == "Geography");
db.SaveChanges();

更新:答案是关于学生有零门或一门课程的情况(如提供的代码所示(。