2014-12-29 2 views
2

웹 프래그먼트 프레임 워크를 사용하여 프론트 엔드 HTML5 응용 프로그램에 백엔드 서비스를 제공하고 있습니다. 개체 관계 매핑을 위해 Entity Framework를 사용합니다. 웹 API는 데이터 조작을 위해 HTTP를 통해 메소드 세트를 노출하며, 프론트 엔드는 데이터 조작 (검색, 삽입, 갱신 등)을 위해 WebAPI를 사용합니다.WebAPI에 저장된 변경 사항을 롤백하는 방법

public class PersonRepository : IPersonRepository 
{ 
    private PersonDetailsContext personContext; 

    public PersonRepository(PersonDetailsContext personContext) 
    { 
     this.personContext= personContext; 
    } 

public sResponse DeleteAccImage(ACCTIMAGE medAccImg) 
    { 
     sResponse sRes = new sResponse(); 
     sRes.IsSuccess = false; 

     try 
     { 
      MEDACCTIMAGE medAccImgDelete = personContext.ACCTIMAGE.Where(X => X.ACCOUNT == medAccImg.ACCOUNT && X.CODE == medAccImg.CODE).SingleOrDefault(); 

      if (medAccImgDelete == null) 
      { 
       sRes.outMessage = "Image does not exist for Account = " + medAccImg.ACCOUNT; 
       return sRes; 
      } 

      personContext.ACCTIMAGE.Remove(medAccImgDelete); 
      personContext.SaveChanges(); 

      sRes.IsSuccess = true; 
     } 
     catch (System.Data.EntityException ex) 
     { 
      sRes.outMessage = ex.Message; 
      throw; 
     } 
     catch (Exception ex) 
     { 
      sRes.outMessage = ex.Message; 
      throw; 
     } 

     return sRes; 
    } 
} 

그리고 이것은 위의 저장소 방법에 대한 프론트 엔드의 요청에 매핑되는 컨트롤러 : 다음은

[ActionName("PostDeleteAccImage")] 
    [APIAuthentication] 
    public sResponse PostDeleteAccImage(ACCTIMAGE accImg) 
    { 
     //here i'm getting database name dynamically to connect to a database specified from front end 
     IPersonRepository personRep = new personRepository(new PersonDetailsContext(PersonRepository.GetDBConnectionString(accImg.DataBaseName))); 
     sResponse sResult = personRep.DeleteAccImage(medAccImg); 
     return sResult; 
    } 

을 나는 웹 API 저장소에서 데이터베이스 작업을 수행하는 방법을 아래

입니다 내 질문 :

SaveChanges()를 호출 한 후 다른 웹 API 메서드 호출을 사용하여 한 웹 API 호출에서 수행 된 변경 사항을 롤백 할 수 있습니까?

이것이 가능한지 아닌지는 잘 모르겠다. 각 API 요청에 대해 컨텍스트가 같지 않을 것이라고 생각하기 때문에 (즉, API의 새 인스턴스가 생성되어 이전 컨텍스트, 내가 맞습니까?).

이전 API 호출의 변경 사항을 롤백 할 수있는 방법이 있습니까?

+0

성공한 SaveChanges가 있다면 몇 가지 이유가 있습니다. 왜 롤백하고 싶습니까? 예외를 던져 다시 호출자에게 답장을 보내지 마십시오. 다시 던지지 마십시오 – dariogriffo

+0

트랜잭션을 사용할 수 있다고 생각되면 http://msdn.microsoft.com/en-us/data/를 확인하십시오. dn456843.aspx. 롤백 할 특정 경우에 트랜잭션을 실패하게 만들 수 있습니다. – Hozikimaru

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

답변

4

짧은 대답 : AFAIK, 아니오. saveChanges()를 호출하면 SQL 문이 데이터베이스에 발행되고 데이터베이스 트랜잭션이 커밋됩니다. 이를 롤백하는 유일한 방법은 데이터베이스 트랜잭션이나 EF 데이터 컨텍스트 작업이 아닌 사용자 정의 구현 작업 일 것입니다.

답 : API에 대한 각 요청에 새로운 데이터 컨텍스트 (액션 메소드의 컨텍스트를 새로 작성한 위의 코드를 기반으로 함)가 올 바르다. 또한 저장소 뒤에 모든 EF 작업을 래핑하는 것을 다시 생각해보십시오. 여기에 viewpoints에서 smart 사람들 describe 이것은 불필요하게 코드를 복잡하게 만들 수 있습니다.

하나의 아이디어는 변경 사항/삽입을 테이블에 "적용"하여 검사를 실행하는 것입니다. 검사가 통과되면 변경 사항을 실제 테이블로 이동하고 그렇지 않으면 스테이지 테이블에서 삭제하십시오.

+0

이것에 대한 귀하의 의견을 보내 주셔서 감사합니다. :) 준비는이 문제를 해결하는 좋은 아이디어 인 것 같습니다. – Gowrish

관련 문제