使用Web API存储库模式编辑/更新

时间:2015-03-11 03:00:05

标签: javascript c# angularjs asp.net-web-api asp.net-mvc-5

我正在尝试使用由存储库模式支持的Web API Controller来更新数据库的基础知识。到目前为止,我有一切工作POST,GET,DELETE(创建,读取,删除)。但我错过了更新。

下面是我的角度代码,我不打算发布角度视图/模板,但只知道它们确实绑定了,它们工作得很好。我的问题只出现在编辑视图上,我尝试使用vm.save功能进行更新。我的保存功能在Angular方面运行良好,但我不确定如何在Web API&存储库方面。你会发现我的代码是非常基本的。我在这里得到了我项目中的所有代码页:

All Files in Gist

以防万一你希望看到全局,否则我只会在这里找几个我无法通过Angular Controller,Web API Controller使用http.put编辑/更新方法的页面&安培;库中。

工作角度编辑控制器:

function editFavoriteController($http, $window, $routeParams) {
    var vm = this;

    var url = "/api/favorites/" + $routeParams.searchId;
    $http.get(url)
        .success(function (result) {
            vm.search = result[0];
        })
        .error(function () {
            alert('error/failed');
        })
        .then(function () {
            //Nothing
        });

    vm.update = function (id) {
        var updateUrl = "/api/favorites/" + id;
        $http.put(updateUrl, vm.editFavorite)
            .success(function (result) {
                var editFavorite = result.data;
                //TODO: merge with existing favorites
                //alert("Thanks for your post");
            })
            .error(function () {
                alert("Your broken, go fix yourself!");
            })
            .then(function () {
                $window.location = "#/";
            });
    };
};

不使用Web API控制器

public HttpResponseMessage Put(int id,[FromBody]Search editFavorite)
{
    if (_favRepo.EditFavorite(id, editFavorite) && _favRepo.Save())
    {
        return Request.CreateResponse(HttpStatusCode.Created, editFavorite);
    }
    return Request.CreateResponse(HttpStatusCode.BadRequest);
}

NOT WORKING Repository

public bool EditFavorite(int id, Search editFavorite)
{
        try
    {
        var search = _ctx.Search.FirstOrDefault(s => s.SearchId == id);

        search(editFavorite).State = EntityState.Modified;
        return true;
    }
    catch
    {
        var item = "";
    }
}

工作界面

bool EditFavorite(int id, Search newSearch);

同样,我唯一的问题是在WebAPI FavoritesControllerFavoritesRepository中确定如何为更新做些什么。我有一个例子,说明我在Gist中做了其他所有事情,所以我希望有人可以帮助我。我只是碰到了我知道如何在Web API中做的事情。

enter image description here

1 个答案:

答案 0 :(得分:3)

固定代码:

public HttpResponseMessage Put(int id,[FromBody]Search editFavorite)
{
    if (_favRepo.EditFavorite(id, editFavorite))
    {
        _favRepo.Save()  
        return Request.CreateResponse(HttpStatusCode.Created, editFavorite);
    }
    return Request.CreateResponse(HttpStatusCode.BadRequest);
}

我也发布了一些代码,这些代码应该可以正常使用WEB API和Repository Pattern处理服务器端的编辑。

WebAPI控制器:

public HttpResponseMessage Put(int id,[FromBody]Search editFavorite)
{
    if (!ModelState.IsValid || id != editFavorite.Id)
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }
    db.EditFavorite(editFavorite);
    try
    {
        db.Save();  
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!db.SearchExists(id))
        {
            return Request.CreateResponse(HttpStatusCode.NotFound);
        }
        else
        {
            throw;
        }
    }
    return Request.CreateResponse(HttpStatusCode.Created, editFavorite);
}

存储库方法:

public void EditFavorite(Search editFavorite)
{
    db.Entry(editFavorite).State = EntityState.Modified;
}

public void Save()
{
    db.SaveChanges();
}

public bool SearchExists(int id)
{
    return db.Search.Count(e => e.Id == id) > 0;
}

修改界面:

void Save();
void EditFavorite(Search newSearch);
bool SearchExists(int id);

修改

我做了一些更改,以便只在db上下文中执行的操作在存储库层(数据层)中完成,并且错误检查在WEB API Controller中完成。

<强>建议:

您应该在接口上继承IDisposable并将其实现为您的存储库类,以便正确处理您的实体......

public interface IFavoritesRepository : IDisposable
{
    // code here
}


public class FavoritesRepository : IFavoritesRepository
{
    // code here
    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                db.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}