具有UoW更新的EF存储库

时间:2016-08-29 12:14:52

标签: c# entity-framework

我相信这是在其他地方被问到但我无法找到直接的解决方案。 我的Api是传递对象模型,在服务器端,未传递的该对象的每个值都被视为null(有意义)。 有没有办法告诉EF6不要以传递对象的方式更新具有空值的实体,我不必编写每个属性并检查它是否为空。

伪代码

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

我的问题是任何具有空值的数据实际上都会用空值重写现有的db记录值。

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

提前谢谢。

2 个答案:

答案 0 :(得分: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;
          }
     }
}

某些场景要求您更新对象的一部分,有时还要更新其他部分,我认为最好的方法是传递字段以从更新中排除

希望它会帮助你

答案 1 :(得分:1)

在进行更新之前,个人不是打击数据库和执行get操作的忠实粉丝。可能在进行ajax调用时,您可以发送一个应该更新的属性列表(这样也可以处理更新为空值(删除现有值)的场景。)

我正在对@Hadi Hassan所做的做些小修改(没有为获取实体而访问数据库):

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不适用于相关实体