Будучи новичком в 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;
Это работает.
Мой вопрос: это то, что ты должен делать?Или есть более чистый подход, о котором я не знаю?
Примечание. При написании этого вопроса я получил дружественное автоматическое уведомление о том, что этот вопрос, вероятно, будет закрыт.Если вы решите закрыть его, пожалуйста, будьте любезны, сообщите мне, почему и укажите мне правильное направление.