2010-08-13 52 views
0

作为Linq-to-SQL的新手,我今天遇到了其中一个问题,我想分享我的解决方案,然后询问是否有东西更好。Linq-to-SQL最佳实践:删除的实体没有真正被删除

我正在为我的工作设置一个员工分配工具。有三个基本的班级/表格:员工,项目,作业。重要的是,在这里,赋值作为员工和项目之间的交接表。我遇到了一个包含绑定到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到SQL,员工以及被删除的作业与之相关的项目已经提及了我认为我正在删除的作业。这导致它最终被提交到数据库。

,我结束了使用在我删除处理程序插入以下代码的修复:

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

这似乎工作。

我的问题:这是你应该做的吗?还是有一种我不知道的更清洁的方法?

注意:在写这个问题时,我收到了一个友好的自动通知,说这个问题可能会被关闭。如果你决定关闭它,那么请告诉我为什么,并指出我有一个好方向。

回答

0

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

DeleteAssignment(someRowID); 

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