2011-05-24 60 views
4

插入这是很基本的问题,我知道,但它现在莫名其妙我:S实体框架4,与国外键值不是ID

我有2个表,学生和课程与外键约束,许多学生1课程。

我在我的学生表中存储了一个CourseId_FK参考,所以当我创建一个学生时,我该如何做到这样?

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

眼下,上述不工作,我有决心

student.CourseId = 22; 

谁能帮我请?

感谢

大卫

+0

我有点困惑,因为学生=>课程是一对多,所以应该是学生。课程? – Vimvq1987 2011-05-24 16:29:43

+0

@ Vimvq1987是的,我很抱歉,我在写我的文章时犯了一个错误,我已经纠正了它,很多学生都修了1门课。 – DeveloperDavid 2011-05-24 16:42:45

回答

4

如果你不希望加载的全部课程实体:

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

这只会获取从DB地理课程的Id(或崩溃时没有任何)。

+0

谢谢,这正是我所期待的。其他答案也让我感到开心。谢谢你们 – DeveloperDavid 2011-05-24 16:49:49

2

我会做这样的事情:

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

更新:答案是什么时候一个学生都有零或一门课程的情况(如提供码)。

+0

'课程'从哪里来? – DeveloperDavid 2011-05-24 16:41:01

+0

@ davidt07,它是db.Courses(答案更新) – bniwredyc 2011-05-24 17:13:23

5

看着你的实体,“学生”有一个“课程”(真正:课程)属性?

你的实体,你想做的事或许应该是这个样子,为:

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所以当你这样你就可以实际的课程对象不分配给您的学生。

+0

如果一个学生有很多课程,那就是正确的答案。 – bniwredyc 2011-05-24 16:35:14

+0

是的,我很抱歉,一个学生只有一门课程,我在写原始问题时犯了一个错误。 – DeveloperDavid 2011-05-24 16:40:17

+0

谢谢,这个开启了我的眼睛让我更加了解Entity Framework,谢谢 – DeveloperDavid 2011-05-24 16:50:58