2015-07-31 2 views
0

В моем Web Api приложения У меня есть несколько таблиц, как эти, и при создании process и загрузки файлов некоторой информации, добавленной к tableLogs:Удаление записей из перемножения таблиц ASP Web Api

tableProcess 
------------------- 
ProcessId Name 
1   proc1 
2   proc2 

tableFile 
------------------------------ 
FileId ProcessId Name 
1    1  file1 
2    1  file2 
3    1  file3 
4    2  file4 
5    2  file5 

tableLogs 
------------------ 
LogId FileId Description 
1   1   log1 
2   1   log2 
3   2   log3 
4   2   log4 
5   3   log5 
6   4   log6 
7   5   log7 

Мне нужно, когда удалить process удалять записи из всех этих таблиц, например, если я хочу, чтобы удалить proc1, файлы file1, file2, & file3 следует исключить из tableFile и первых пяти журналов, которые соответствовали этим три файлу должен быть удален из tableLogs. И я не смог удалить журналы, связанные с tableFile. Любые предложения, как это сделать?

UPDATE

создать процедуру магазина, как это было предложено @ websch01ar в своем ответе, и теперь мой метод выглядит следующим образом:

public IHttpActionResult DeleteLeadProcess(int id) 
     { 
      var procId = db.tableProcess.SingleOrDefault(p => p.ProcessId == id); 

      string errMsg = null; 
      using (var transaction = db.Database.BeginTransaction()) 
      { 
       try 
       { 
        db.deleteProcess(id); 
        transaction.Commit(); <-- error here 
       } 
       catch (Exception e) 
       { 
        transaction.Rollback(); 
        errMsg = e.Message; 
        return BadRequest(errMsg); 
       } 
      } 
      return Ok("Process " + procId.ProcessName + " has been deleted successfully!"); 
} 

процедура отлично работает, если я запустить его в SQL Server, но в контроллере у меня есть ошибка «A System.Data.SqlClient.SqlException было выбрано:« Операция транзакции не может быть выполнена, потому что есть ожидающие запросы на эту транзакцию ».

+0

Можете ли вы использовать хранимые процедуры в своей среде? – websch01ar

+0

@ websch01ar, да, я могу использовать хранимые процедуры –

+0

Alex, я бы рекомендовал этот тип процесса. Это упростит ваш веб-метод api и поместит работу SQL там, где он принадлежит ... в SQL DB. Вам нужна помощь в написании этого sproc? – websch01ar

ответ

0

Моя рекомендация - переключиться на выполнение хранимой процедуры, когда вам нужно обрабатывать каскадные удаления, как вы хотите. Вот придуманная хранимая процедура, которую вы можете использовать. Обратите внимание, что я использую свой собственный шаблон sproc, и вам может не понадобиться все это

USE [Database] 
GO 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[csp_Application_DeleteProcessRecords]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].[csp_Application_DeleteProcessRecords] 
GO 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 


CREATE PROCEDURE [dbo].[csp_Application_DeleteProcessRecords] 
    @ProcessID int 
AS 
BEGIN 

    /****************************************************************************** 
    ** File: csp_Application_DeleteProcessRecords.sql 
    ** Name: csp_Application_DeleteProcessRecords 
    ** Desc: 
    ******************************************************************************* 
    ** Change History 
    ******************************************************************************* 
    ** Date:  Author:    Description: 
    ** -------- --------   ------------------------------------------- 
    ** 07-31-00 Cool Developer  Creation. 
    ** 
    *******************************************************************************/ 
    BEGIN TRY 

     /* 
      Delete from tableLogs 
     */ 
      Delete TL 
      from [Database].dbo.tableLogs TL 
      JOIN [Database].dbo.tableFile TF on TL.FileID = TF.FileID 
      Where TF.ProcessID = @ProcessID; 

     /* 
      Delete from tableFile 
     */ 
      Delete TF 
      from [Database].dbo.tableFile TF 
      Where TF.ProcessID = @ProcessID; 

     /* 
      Delete from Process 
     */ 
      Delete TP 
      from [Database].dbo.tableProcess TP 
      where ProcessID = @ProcessID; 

      Select 1; -- true as an output? 
    END TRY 

    BEGIN CATCH 

     BEGIN 
      Rollback; 
      DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT, @ErrorState INT; 

      SELECT 
       @ErrorMessage = ERROR_MESSAGE(), 
       @ErrorSeverity = ERROR_SEVERITY(), 
       @ErrorState = ERROR_STATE(); 

      RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState); 
     END 

    END CATCH; 
END 
Go 

/* 
** Test Scripts 
*/ 

/* 
Declare @ProcessID int = (Select 'A') 
exec [Database].dbo.csp_Application_DeleteProcessRecords @ProcessID 1 

*/ 
+0

У меня есть ошибка при попытке этого кода, может быть, вы можете помочь? «Устройство чтения данных, возвращаемое поставщиком данных хранилища, не имеет достаточного количества столбцов для запрошенного запроса» Я добавлю обновленный контроллер в свой вопрос –

+0

Извините за задержку, похоже, что вы прошли мимо этого, но теперь получаете ошибка транзакции. Вы пытались вызвать db.SaveChanges() непосредственно перед сообщением фиксации? – websch01ar

+0

Я пробовал это, но у меня все еще есть ошибка «Операция транзакции не может быть выполнена, потому что есть ожидающие запросы на эту транзакцию». Поэтому я просто беру часть вашей процедуры, чтобы удалить записи из таблицыLog и записать ее на C# с помощью моего старого контроллера, и это работает для меня. Спасибо за помощь) –

Смежные вопросы