Лучшие практики Linq-to-SQL: удаленные объекты на самом деле не удаляются

Будучи новичком в Linq-to-SQL, сегодня я столкнулся с одной из его ошибок и хотел поделиться моим решением, а затем спросить, есть ли что-то лучшее.

Я настраиваю инструмент распределения персонала для своей работы. Есть три основных класса/таблицы: Сотрудник, Проект, Назначение. Здесь важно отметить, что Assignment служит связующей таблицей между Employee и Project. Я столкнулся со своей проблемой в форме, которая содержала DataGridView, привязанный к BindingList. Проблема возникла, когда пользователь решил создать новое задание, но перед сохранением изменений решил удалить только что созданное новое задание. К сожалению, сохранение привело к тому, что удаленное задание все равно было сохранено!

Вот (несколько упрощенная) версия моего наивного обработчика удаления:

//Assume that assignments is the BindingList<Assignment> bound
//to the dataGridView
private void DeletedRowHandler(object sender, EventArgs e)
{
    DataGridViewRow row = dataGridView.GetSelectedRow();
    Assignment assignment = (Assignment) row.DataBoundItem();
    assignments.Remove(assignment);

    try
    {
        db.Intervals.DeleteOnSubmit(assignment);
    }
    catch
    {
    }

}    

После долгого плача и скрежета зубов мне пришло в голову, что с помощью волшебства, если Linq-to-SQL, Сотрудник и Проект, с которыми было связано удаленное задание, уже имели ссылку на Назначение, которое, как я думал, я удалял. Это привело к тому, что в конечном итоге он был отправлен в базу данных.

Исправление, которое я в итоге использовал, заключалось в том, чтобы вставить следующий код в мой обработчик удаления:

assignment.Employee = null;
assignment.Project = null;

Кажется, это работает.

Мой вопрос: это то, что вы должны делать? Или есть более чистый подход, о котором я не знаю?

Примечание. При написании этого вопроса я получил дружественное автоматическое уведомление о том, что этот вопрос, скорее всего, будет закрыт. Если вы решите закрыть его, пожалуйста, объясните мне причину и укажите правильное направление.


person JnBrymn    schedule 13.08.2010    source источник


Ответы (1)


Предложите удалить по ID, если сможете. Пусть DataContext найдет объект по его ключу и передаст этот объект в метод Delete.

DeleteAssignment(someRowID);

...
public void DeleteAssignment(int assignmentID)
{
    db.Assignments.DeleteOnSubmit(
       db.Assignments.SingleOrDefault(a=>a.ID==assignmentID)
    );
    db.SubmitChanges();
}
person p.campbell    schedule 13.08.2010