2015-09-28 2 views
0

У меня есть проект Web Api и в настоящее время обновление объекта выполняется через POST. Создание объекта также выполняется с помощью одного метода POST, и я реализую его, проверяя, отправил ли пользователь мне идентификатор объекта, а затем реализует обновление, а не создание.Самый простой способ реализовать метод API PUT для обновления объекта

Это плохо подходит для многих очевидных причин. Это также запутывает с точки зрения клиента и делает весь метод медленным и трудным для определения.

Так что я расщепление обновления в метод 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(); 

Как я new для создания API API Я задался вопросом, является ли это стандартом для создания методов обновления PUT. Это может быть закрыто как основанное на мнении, но я хотел бы знать, хорошо ли эта реализация, поскольку у меня не было никакого руководства по созданию этого API.

+0

Проверьте, как вы можете использовать 'Delta ' в 'Web Api'. Я надеюсь, что [эта статья] (http://www.strathweb.com/2013/01/easy-asp-net-web-api-resource-updates-with-delta/) поможет вам начать работу и дать вам представление как вы можете использовать 'Delta ' с помощью метода 'PUT'. – Michael

+0

@Michael Спасибо, это действительно интересно. Любопытно, каковы причины метода патча, когда в моем методе PUT выше может обновляться с частичной модели? Это просто соглашение или есть нечто более конкретное? – JonnyKnottsvill

ответ

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; 
    } 
} 
+0

спасибо! Я дам это go – JonnyKnottsvill

+0

Скажите, прошел ли мой пользователь неполную модель, и поэтому некоторые значения были равны нулю, приведет ли это к созданию нулевых значений для определенных полей в моей базе данных? @ kienct89 – JonnyKnottsvill

+0

@JonnyKnottsvill: да, он создаст нулевые значения, если столбец имеет значение NULL –

Смежные вопросы