如何在不归零属性的情况下使用Automapper更新Entity Framework中的对象?

时间:2018-05-18 14:09:06

标签: c# .net entity-framework automapper

我正在尝试使用Entity Framework更新实体并将其保存到数据库中。调用更新时,我的服务方法检索DTO,为其分配UI传递给它的实体对象的值,然后将其保存到数据库中。我不想手动分配这些值,而是想使用Automapper,但是当我这样做时,我没有映射的值会更新为null。有没有办法在Entity Framework或Automapper中阻止这种情况?

服务方法查找数据库中的现有对象,为其分配新实体的属性,然后保存:

public void Update(MyEntity updatedEntity, int id)
{
    var existingObject = db.tblmyentity.Find(id);

    existingObject.name = updatedEntity.name;
    existingObject.address = updatedEntity.address;
    existingObject.phone = updatedEntity.phone;

    db.SaveChanges();
}

但是,UI中无法访问此对象的字段中存储的值,例如谁修改了对象以及何时修改了对象。使用AutoMapper简化此代码(如下所示)会导致这些字段更新为null:

public void Update(MyEntity updatedEntity, int id)
{
    var existingObject = db.tblmyentity.Find(id);

    Mapper.Map(updatedEntity, existingObject);

    db.SaveChanges();
}

1 个答案:

答案 0 :(得分:1)

一个好的做法是创建一个(service,api)模型,该模型只包含可以更新的相关属性。 E.g:

public class MyEntityServiceModel
{
    public string name { get; set; }
    public string address { get; set; }
    public string phone { get; set; }
}

// this looks differently in recent versions of AutoMapper, but you get the idea
Mapper.CreateMap<MyEntityServiceModel, MyEntity>();

// your update functions looks the same, except that it receives a service model, not a data model

Update(MyEntityServiceModel updatedEntity, int id) 
{
   // same code here
}

这种方法具有以下优点:

  • 你得到了你想要的东西
  • 安全:您不会冒更新属性的风险,因为服务模型明确指定了应更新的属性
  • 序列化:如果您需要序列化(EF模型可能包含不需要的导航属性),服务模型更合适
  • Update函数使用者不会意识到您正在使用的数据持久性库。