实现PUT API方法更新实体

时间:2015-09-28 15:17:12

标签: c# entity-framework asp.net-web-api

我有一个Web Api项目,目前通过POST完成实体更新。创建实体也是通过相同的POST方法完成的,我通过检查用户是否向我发送了实体ID然后实现更新而不是创建来实现。

由于许多明显的原因,这是不好的。从客户的角度来看,它也令人困惑,并使整个方法变得缓慢而难以定义。

所以我将更新拆分为PUT方法,我希望它像这样(伪代码)

public string PUT(MyModel model){

    //Check if model Id is sent. return if not.


    //Check what other fields have been sent.


    //Update only those fields using EF and save.

    }

我会像:

一样实现
var toUpdate = context.MyModels.FirstOrDefault(x => x.Id == model.Id);

if(toUpdate == default(MyModel)){ //Return error to client }

if(model.first != null){ toUpdate.first = model.first; }
//Repeat for every field.

context.MyModels.AddOrUpdate();
context.SaveChanges();

由于我是构建API的新手,我想知道这是否是创建PUT更新方法的标准。这可能会以基于意见的方式结束,但我想知道这个实现是否合适,因为我没有真正构建此API的指导。

1 个答案:

答案 0 :(得分:0)

对于您的情况,我认为您可以这样实施。

try
{
    context.Entry<MyModel>(model).State = EntityState.Modified;
    context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
    var msg = dbEx.EntityValidationErrors.Aggregate(string.Empty, (current1, validationErrors) => validationErrors.ValidationErrors.Aggregate(current1, (current, validationError) => current + (Environment.NewLine + $"Property: {validationError.PropertyName} Error: {validationError.ErrorMessage}")));
    var fail = new Exception(msg, dbEx);
    throw fail;
}

实际上,我更喜欢将更新代码放在generic类中,这样我就不需要为每个实体编写更新代码

public void DoUpdate<TEntity>(TEntity entity) where TEntity : class
{
    try
    {
        Context.Entry(entity).State = EntityState.Modified;
        Context.SaveChanges();
    }
    catch (DbEntityValidationException dbEx)
    {
        var msg = dbEx.EntityValidationErrors.Aggregate(string.Empty, (current1, validationErrors) => validationErrors.ValidationErrors.Aggregate(current1, (current, validationError) => current + (Environment.NewLine + $"Property: {validationError.PropertyName} Error: {validationError.ErrorMessage}")));
        var fail = new Exception(msg, dbEx);
        throw fail;
    }
}