【问题标题】:Edit /Update with Web API Repository Pattern使用 Web API 存储库模式编辑/更新
【发布时间】:2015-05-12 17:23:53
【问题描述】:

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

以下是我的 Angular 代码,我不打算发布 Angular 视图/模板,但只知道它们确实绑定并且工作正常。我的问题仅在编辑视图上,我尝试使用vm.save 函数进行更新。我的保存功能在 Angular 端运行良好,但我不确定在 Web API 和存储库端该怎么做。你会看到我的代码让这个工作是非常基本的。我的项目中的所有代码页都在这里:

All Files in Gist

以防万一你想看大图,否则我只会放在这里我无法让编辑/更新方法在使用 http.put 与 Angular 控制器、Web API 控制器和存储库.

工作 Angular 编辑控制器:

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);
}

不工作的存储库

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 中做的事情。

【问题讨论】:

  • editFavorite 参数是否为空?传入请求中的 Content-Type 标头是否设置正确?
  • 我不熟悉 .Name(...) 的作用,但我认为应该是 _ctx.Entry(editFavorite).State = EntityState.Modified;示例参考msdn.microsoft.com/en-au/data/jj592676.aspx
  • 我可以再次检查,但我认为一切正常,我的问题是我之前从未实施过更新请求,我无法弄清楚如何设置我的 PUT 操作和我在存储库端的编辑方法。我发送的 id 和 editFavorite 对象与我在其他场合使用删除或添加相同。并且我会确保按照您的要求正常工作,但我的主要问题是我只是在黑暗中刺伤,以了解在 C# 方面为这次更新做些什么。
  • 如果您通过了有效的 editFavourite 对象,那么我认为您的 WebAPI 代码没有任何问题。我无法帮助您的 EF/Repository 代码。我也不明白那个 search.Name(.. line of code.
  • 哎呀,这是我的错字。让我解决这个问题。

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


【解决方案1】:

固定代码:

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 和存储库模式处理服务器端的编辑。

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);

编辑:

我进行了一些更改,以便仅在存储库层(数据层)中完成对您的数据库上下文执行的操作,并在 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);
    }
}

【讨论】:

  • 嗨 Syed,这看起来与我在 Web API 教程中看到的一段代码非常相似。我尝试使用整体思路,并切换出我所有的类和对象等。但没有运气。有什么办法可以修改代码以适应我的场景。在那之前,我会看看我能用它做什么。
  • 我很感激,我真的很感谢您抽出宝贵的时间并帮助我尝试将各个部分组合在一起,我会告诉您一些进展情况。
  • 抱歉,这里的回复很晚 :) 我正在编辑问题...我目前正在我正在处理的一个项目中使用此代码,因此我不得不复制粘贴然后对其进行编辑/c 你的问题。是的,代码类似于教程,因为我是从 Microsoft 网站上的一篇文章中学到的,只是根据我的需要对其进行了修改...如果代码适合您,我们很乐意为您提供帮助 :)
  • 恭喜:P 我认为我应该得到一个赞成票和答案选择哈哈
  • 如果您愿意,我可以向您发送一个文件和 t4 模板,它会根据您的数据库自动生成存储库模式...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多