2016-08-29 36 views
2

我相信这是问别人,但我找不到直接的解决方案。 我的Api正在传递对象模型,并且在服务器端,那个未传递的对象的每个值都被认为是null(有意义)。 有没有办法告诉EF6不要以传递对象的空值更新实体,我不需要写每个属性并检查它是否为空。EF仓库与UoW更新

伪代码

API

Update(int id, TaskEntity obj) 
{ 
    unitOfWork.Tasks.Update(id, userTask); 
    ... 
    unitOfWork.Save() 
} 

回购更新

Update(int id, T entity) 
     { 
      var existingRecord = Get(id); //Gets entity from db based on passed id 
      if (existingRecord != null) 
      { 
       var attachedEntry = Context.Entry(existingRecord); 
       attachedEntry.CurrentValues.SetValues(entity); 
      } 
     } 

我的问题是,随着空值的任何数据实际上将改写用null现有的数据库记录值。

请给我一个解决方案或文章,这是解决。我应该去思考,也许automapper可以处理这个(它不是我相信的目的),或者应该写一些辅助方法,因为我的对象可以包含子对象。

预先感谢您。

+0

您是否有TaskEntity中的属性列表,您将在此更新方法中进行更新?或者你想更新所有的属性,不是null。但是,那么如何区分未提供的值与我想要删除/更新为空的值? – Developer

+0

如果我正确理解你的问题,你可以将所有相关信息传递给方法,并对整个实体进行更新。 – Eldho

+0

如果你想使用反射,你可以这样做http://stackoverflow.com/questions/17385472/entity-framework-only-update-values-that-are-not-null。但个人我不觉得这是最好的东西 – Eldho

回答

5

你可以做这样的事情

Update(int id, T entity,string[] excludedFields) 
{ 
    var existingRecord = Get(id); //Gets entity from db based on passed id 
    if (existingRecord != null) 
    { 
      var attachedEntry = Context.Entry(existingRecord); 
      attachedEntry.CurrentValues.SetValues(entity); 
      for(var field in excludedFields) 
      { 
       attachedEntry.Property(field).IsModified = false; 
      } 
    } 
} 

一些scenaries要求更新对象的一部分,有时其他部分,在我看来,最好的办法是通过字段从更新中排除

希望它会帮助你

+0

我已经看到了某种解决方案,我可能会以某种布尔值结束,这将确定应该通过空值被忽略或更新,谢谢回答 – Raimonds

1

个人不打数据库,并做更新之前做一个GET操作的大风扇。可能在执行ajax调用时,您可以发送一个您应该更新的属性列表(以便更新为空值(擦除现有值的场景)也将被处理)。

我做小的修改到什么@Hadi哈桑做(没有击中用于获取实体数据库):

Update(T entity,string[] includedFields) 
{ 
    var existingRecord = Context.Attach(entity); // assuming primary key (id) will be there in this entity 
    var attachedEntry = Context.Entry(existingRecord); 

    for(var field in includedFields) 
    { 
     attachedEntry.Property(field).IsModified = true; 
    } 

} 

注 - attachedEntry.Property(场).IsModified不会为相关工作实体