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

-1

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 に答える