Най-добри практики за Linq към SQL: Изтрити обекти, които всъщност не се изтриват

Тъй като съм нов в Linq-to-SQL, днес попаднах на един от него и исках да споделя моето решение и след това да попитам дали има нещо по-добро.

Създавам инструмент за разпределение на персонала за моята работа. Има три основни класа/таблици: Служител, Проект, Задание. Важното тук е, че Назначаването служи като свързваща таблица между Служител и Проект. Сблъсках се с моя проблем във формуляр, който съдържа 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
    {
    }

}    

След много плач и скърцане със зъби ми хрумна, че чрез магията if 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