Рекомендации Linq-to-SQL: Удаленные объекты не удаляются - PullRequest
0 голосов
/ 14 августа 2010

Будучи новичком в Linq-to-SQL, я столкнулся с одним из его Gotchas сегодня, и я хотел бы поделиться моим решением, а затем спросить, было ли что-то лучше.Я устанавливаю инструмент распределения персонала для моей работы.Существует три основных класса / таблицы: Сотрудник, Проект, Назначение.Здесь важно, что Назначение служит связующей таблицей между Сотрудником и Проектом.Я столкнулся с проблемой в форме, которая содержала 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, Employee и Project, с которыми было связано удаленное назначение, уже имеют ссылку на Назначение, которое, по моему мнению, я удаляю.Это в конечном итоге приводило к его отправке в базу данных.

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

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

Это работает.

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

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

1 Ответ

0 голосов
/ 14 августа 2010

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

DeleteAssignment(someRowID);

...
public void DeleteAssignment(int assignmentID)
{
    db.Assignments.DeleteOnSubmit(
       db.Assignments.SingleOrDefault(a=>a.ID==assignmentID)
    );
    db.SubmitChanges();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...