Linq-to-SQL最佳实践:删除的实体并未真正被删除

时间:2010-08-13 21:31:25

标签: linq-to-sql

作为Linq-to-SQL的新手,我今天遇到了其中一个问题,我想分享我的解决方案,然后询问是否有更好的东西。

我正在为我的工作设置员工分配工具。有三个基本的类/表:Employee,Project,Assignment。重要的是,Assignment用作Employee和Project之间的联结表。我在包含绑定到BindingList的DataGridView的表单上遇到了我的问题。问题出现在用户决定创建新作业时,但在保存更改之前,他们决定删除他们刚刚创建的新作业。不幸的是,保存导致删除的分配无论如何都被保存了!

这是我的天真删除处理程序的一个(稍微简化)版本:

//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;

这似乎有效。

我的问题:这是你应该做的吗?或者有一种我不了解的清洁方法吗?

注意:在写这个问题时,我得到了一个友好的,自动的通知,这个问题可能会被关闭。如果您决定关闭它,那么请善意地告诉我原因并指出我的方向。

1 个答案:

答案 0 :(得分:0)

如果可以,建议按ID删除。让DataContext按其键找到实体,并将该实体提供给Delete方法。

DeleteAssignment(someRowID);

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