0

我的问题是这样的:

        Inspections
            InspectionItems

在我的关系数据库中,我需要“级联”删除,以便周围没有多余的数据。例如,如果我删除一个检查,它还需要删除所有相关项目。

我已将代码写入域服务类:

        public void IDInspectionDelete(string id)
        {
            var inspections = from a in ObjectContext.Inspections
                              where a.ID == new Guid(id)
                              select a;
            foreach (Inspection inspection in inspections)
            {
                var items = from a in ObjectContext.InspectionItems
                            where a.InspectionID == inspection.ID
                            select a;
                foreach (InspectionItem item in items)
                {
                    DeleteInspectionItem(item);
                }
                DeleteInspection(inspection);
            }
        }

然后在我的视图模型中调用该函数:

        context.IDInspectionDelete(id_string);

...什么都不做。完全没有。不是窥视。代码将逐步执行,没有错误等,但不会删除。我将把它重新写入我的视图模型并调用

context.Remove(item)

这应该工作。但我想在 DomainService 类中使用它。

除非,当然,这是一个很大的禁忌。如果是,请解释原因。

谢谢!

4

2 回答 2

0

这个问题的解决方案是使用 ObjectContext 在域服务类中完成这一切;

域服务类

[Invoke]
public bool DeleteInspection(Guid ID)
{
    bool bResult = false;

    // get the inspection to delete
    Inspection inspection = this.ObjectContext.Inspections.Where(a=>a.ID == ID).FirstOrDefualt();

    // first delete all attached entities
    foreach (InspectionItem item in inspection.Items)
    {
        this.ObjectContext.DeleteObject(item);
    }

    // save changes
    this.ObjectContext.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

    // then delete item itself
    this.ObjectContext.DeleteObject(inspection);

    // set result to true only if at least one record has been effected
    if (this.ObjectContext.SaveChanges(SaveOptions.AcceptAllChangesAfterSave) >0)
        bResult = true;

    return bResult;        
}

查看模型

context.DeleteInspection(InspectionID, io =>
{
    if (io.Value)
        MessageBox.Show("Inspection successfully deleted");
}, null);
于 2013-04-04T11:20:22.150 回答
-1

一种选择是对数据库表使用 SQL 触发,以便级联删除与应用程序完全无关。这意味着我可以调用context.Remove(item)并且数据库将通过删除级联。

以防万一它对人们有用,我也会把我的 SQL:

SQL

   ALTER TRIGGER [dbo].[InspectionDeleteTrigger] 
   ON  [dbo].[Inspection] 
   INSTEAD OF DELETE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Delete ALL Items Linked to deleted Inspection --
    DELETE FROM InspectionItem
    FROM InspectionItem AS tbl JOIN deleted AS d ON tbl.InspectionID = d.ID

    -- Delete current Inspection --   
    DELETE FROM Inspection  
    FROM Inspection AS tbl JOIN deleted AS d ON tbl.ID = d.ID

END
于 2012-06-20T15:59:52.300 回答