2016-02-18 67 views
1

我正在嘗試使用AngularJS和ASP.NET Web API創建一個小型應用程序。現在應用程序由2個實體組成,即專輯和歌曲。 Song實體將具有Album實體的引用。與AngularJS和ASP.NET Web API交易

現在我想知道什麼是實現交易的正確方法,以便在保存相冊時保存與該相冊有關的所有歌曲。

另外我想知道WebAPI中的POST方法將如何處理歌曲數組(作爲JSON傳遞)。

[ResponseType(typeof(AlbumSong))] 
public async Task<IHttpActionResult> PostMovieSong(AlbumSong albumSong) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    db.AlbumSongs.Add(albumSong); 
    await db.SaveChangesAsync(); 

    return CreatedAtRoute("DefaultApi", new { id = albumSong.Id }, albumSong); 
} 

有人請賜教給我。 謝謝:)

回答

0

您可以使用ActionFilter將所有請求包裝在交易中。事情是這樣的:

public class TransactionPerRequest : IActionFilter, IDisposable 
{ 
    private TransactionScope transaction; 

    private bool isSuccess = false; 

    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext) 
    { 
        transaction = new TransactionScope(
      TransactionScopeOption.Required, 
      new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }); 

    } 

    void IResultFilter.OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     var code = filterContext.HttpContext.Response.StatusCode; 
     isSuccess = code >= 200 && code <= 399; 
    } 

    public void Dispose() 
    { 
     if (transaction != null) 
     { 
      if (isSuccess) 
      { 
       transaction.Complete(); 
      } 

      transaction.Dispose(); 
     } 
    } 

至於歌曲的數組,你會綁定到歌曲PostMovieSong(AlbumSong[] albumSongs)數組,然後使用類似的AddRange db.AlbumSongs.AddRange(albumSong);。不過,我不得不說,你不應該通過電線傳遞域/數據庫實體。考慮使用DTO模式和類似automapper的東西