Обновление сущности с помощью Entity Framework 4 - PullRequest
0 голосов
/ 28 января 2011

Вот код, который я использую для создания нового ученика.

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();
    }
}

Вот как я его использую:

private void SaveInformation()
{
    Student student = new Student();
    Int64 gradeId = Convert.ToInt64(cmbGradeParalelo.SelectedValue);
    student.IDGrade = gradeId;
    student.RUDE = Convert.ToInt64(txtRude.Text);

    /*Parents information.*/
    student.FatherName = txtNombrePadre.Text;
    student.FatherProfession = txtProfesionPadre.Text;
    student.MobilePhoneFather = FormatPhoneNumber(txtCelularPadre.Text);
    student.PlaceofWorkFather = txtLugarDeTrabajoPadre.Text;

    student.MotherName = txtNombreMadre.Text;
    student.MotherProfession = txtProfesionMadre.Text;
    student.MobilePhoneMother = FormatPhoneNumber(txtCelularMadre.Text);
    student.PlaceofWorkMother = txtLugarDeTrabajoMadre.Text;

    /*Student information*/
    student.Name = txtNombre.Text;
    student.FatherLastName = txtApellidoPaterno.Text;
    student.MotherLasteName = txtApellidoMaterno.Text;
    student.DateOfBirth = dtpFechaNacimiento.Value.ToShortDateString();
    student.PlaceOfBirth = txtLugarNacimiento.Text;
    student.Sex = sexoMasculino.Checked ? sexoMasculino.Text : sexoFemenino.Text;
    student.Telephone = FormatPhoneNumber(txtTelefono.Text);
    student.MobilePhone = FormatPhoneNumber(txtCelular.Text);
    student.Address = txtDireccion.Text;
    student.Carnet = FormatPhoneNumber(txtCarnet.Text);
    student.Observations = txtObservaciones.Text;

    StudentRepository repo = new StudentRepository();
    repo.Add(student);
    repo.Save();
    MessageBox.Show("Se guardo el registro exitosamente.",
        "Exito!",
        MessageBoxButtons.OK,
        MessageBoxIcon.Information,
        MessageBoxDefaultButton.Button1);
    ClearForm();
}

Проблема заключается в том, что когда я загружаю информацию в форму и снова нажимаю кнопку Сохранить, создается новый студент. Я хотел бы изменить информацию о студентах.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 28 января 2011

Самое простое решение состоит в том, чтобы сначала получить Студента, а затем внести изменения.

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?Возможно, вам лучше использовать элемент управления с EntityDataSource , в отличие от кропотливой задачи обновления модели вручную.

0 голосов
/ 28 января 2011

Вы создаете новый экземпляр Student самостоятельно каждый раз, когда нажимаете сохранить. Это правильно, если вы хотите создать новую запись Student, но если вы хотите отредактировать существующую запись, вам придется изменить запись Student, которую вы извлекли из базы данных.

Лучший ОО-подход заключается в том, чтобы вызывающая форма передавала объект Student в форму редактора вашего студента. Таким образом, вызывающая форма сама создаст экземпляр нового объекта Student, если создаст новый, а затем, если DialogResult формы - OK, добавьте его в контекст и сохраните. В случае открытия существующей записи, вызывающая форма передаст существующую запись Student редактору, а затем вызовет Save() после ее закрытия.

На несвязанной заметке вам действительно нужно Dispose контекста, как только вы закончите с ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...