C# 使用实体框架4更新实体

C# 使用实体框架4更新实体,c#,entity-framework,sqlite,C#,Entity Framework,Sqlite,下面是我用来创建新学生的代码 public class StudentRepository { SchoolEntities db = new SchoolEntities(); public IQueryable<Student> FindAllStudents() { return db.Students; } public Student FindStudent(int id) { return

下面是我用来创建新学生的代码

public class StudentRepository
{
    SchoolEntities db = new SchoolEntities();

    public IQueryable<Student> FindAllStudents()
    {
        return db.Students;
    }

    public Student FindStudent(int id)
    {
        return db.Students.SingleOrDefault(c => c.ID == id);
    }

    public void Add(Student Student)
    {
        db.AddToStudents(Student);
    }

    public void Save()
    {
        db.SaveChanges();
    }
}
问题是,当我将信息加载到表单上,并再次单击“保存”时,会创建一个新学生。我想修改学生信息


有什么建议吗?

每当单击“保存”时,您都会自己创建一个新的
学生
实例。如果要创建新的
Student
记录,这是正确的,但如果要编辑现有记录,则必须修改从数据库检索的
Student
记录

更好的OO方法是让调用表单将
Student
对象传递给学生编辑器表单。这样,如果创建一个新的
Student
对象,调用表单将实例化一个新的
Student
对象本身,然后如果表单的
DialogResult
OK
,将其添加到上下文中并保存。在打开现有记录的情况下,调用表单会将现有的
Student
记录传递给编辑器,然后在关闭后调用
Save()

另一方面,一旦处理完上下文,您确实需要
处理它

最简单的解决办法是先找到学生,然后进行更改

var existingStudent = StudentRepository.FindStudent(1); // object now in EF graph
student.RUDE = Convert.ToInt64(txtRude.Text); // object now set to EntityState.Modified
// other fields
repo.Save(); // object saved to database
请注意,不要这样做:

db.AddToStudents(Student);
EF4中推荐的方法是:

db.Students.AddObject(Student);

从代码的外观来看,我猜这是WinForms还是WPF应用程序?与手动更新模型的艰巨任务相比,使用控件可能更好。

如何处理上下文?@Sergio:Call
dispose()
处理上下文实例。如果您真的想使用现有的模式(您有一个封装上下文的类),最好的办法是让您的类实现
IDisposable
,然后在其中创建一个名为
Dispose()
的函数,该函数调用
db.Dispose()
。然后,每当您在代码中使用类时,请使用
块将其包含在
中。这两种不同的添加方式有什么区别?@Sergio:从功能上讲,没有什么区别,但有一种不推荐使用(最终将从框架中删除)。对于新代码,您应该使用推荐的版本。是的,但在这里,您正在执行一个不必要的选择请求。如果您没有使用EF,这将不是必需的,一个ID就足够了。有没有一种方法可以在没有选择的情况下执行相同的操作?
db.Students.AddObject(Student);