使用AngularJS和ASP.NET Web API进行事务处理

使用AngularJS和ASP.NET Web API进行事务处理,angularjs,transactions,asp.net-web-api2,Angularjs,Transactions,Asp.net Web Api2,我正在尝试使用AngularJS和ASP.NET Web API创建一个小应用程序。现在,该应用程序由两个实体组成,即唱片集和歌曲。歌曲实体将具有唱片集实体的引用 现在我想知道什么是实现交易的正确方法,这样当一张专辑被保存时,与该专辑相关的所有歌曲也都会被保存 我还想知道WebAPI中的POST方法如何处理歌曲数组(作为JSON传递) [ResponseType(typeof(AlbumSong))] 公共异步任务PostMoveSong(AlbumSong AlbumSong) { 如果(!M

我正在尝试使用AngularJS和ASP.NET Web API创建一个小应用程序。现在,该应用程序由两个实体组成,即唱片集和歌曲。歌曲实体将具有唱片集实体的引用

现在我想知道什么是实现交易的正确方法,这样当一张专辑被保存时,与该专辑相关的所有歌曲也都会被保存

我还想知道WebAPI中的POST方法如何处理歌曲数组(作为JSON传递)

[ResponseType(typeof(AlbumSong))]
公共异步任务PostMoveSong(AlbumSong AlbumSong)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
db.AlbumSongs.Add(albumSong);
等待db.saveChangesSync();
返回CreatedAtRoute(“DefaultApi”,新的{id=albumSong.id},albumSong);
}
有人能告诉我这件事吗。
谢谢:)

您可以使用
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();
        }
    }
公共类TransactionPerRequest:IActionFilter,IDisposable
{
私人交易范围交易;
private bool issucess=false;
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
事务=新事务范围(
TransactionScopeOption。必需,
新事务选项{IsolationLevel=IsolationLevel.ReadUncommitted});
}
void IResultFilter.OnResultExecuted(ResultExecutedContext筛选器上下文)
{
var code=filterContext.HttpContext.Response.StatusCode;

isSuccess=code>=200&&code您可以使用
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();
        }
    }
公共类TransactionPerRequest:IActionFilter,IDisposable
{
私人交易范围交易;
private bool issucess=false;
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
事务=新事务范围(
TransactionScopeOption。必需,
新事务选项{IsolationLevel=IsolationLevel.ReadUncommitted});
}
void IResultFilter.OnResultExecuted(ResultExecutedContext筛选器上下文)
{
var code=filterContext.HttpContext.Response.StatusCode;
isSuccess=code>=200&&code