我有一个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的指导。
答案 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;
}
}