C# 如何使用Automapper更新实体框架中的对象而不清空属性?

C# 如何使用Automapper更新实体框架中的对象而不清空属性?,c#,.net,entity-framework,automapper,C#,.net,Entity Framework,Automapper,我正在尝试使用实体框架更新实体并将其保存到数据库中。调用更新时,my service方法检索DTO,为其分配UI传递给它的实体对象的值,然后将其保存到数据库。我希望使用Automapper,而不是手动分配这些值,但是当我这样做时,我没有映射的值将更新为null。实体框架或Automapper中是否有防止这种情况的方法 服务方法在数据库中查找现有对象,为其分配新实体的属性,然后保存: public void Update(MyEntity updatedEntity, int id) {

我正在尝试使用实体框架更新实体并将其保存到数据库中。调用更新时,my service方法检索DTO,为其分配UI传递给它的实体对象的值,然后将其保存到数据库。我希望使用Automapper,而不是手动分配这些值,但是当我这样做时,我没有映射的值将更新为null。实体框架或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();
}

一个好的实践是创建一个(服务,api)模型,该模型只包含可以更新的相关属性。例如:

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
}
公共类MyEntityServiceModel
{
公共字符串名称{get;set;}
公共字符串地址{get;set;}
公用字符串电话{get;set;}
}
//这在AutoMapper的最新版本中看起来有所不同,但你明白了
CreateMap();
//您的更新函数看起来是一样的,只是它接收的是服务模型,而不是数据模型
更新(MyEntityServiceModel更新属性,int-id)
{
//这里的代码相同
}
这种方法有以下优点:

  • 你得到了你想要的
  • 安全性:由于服务模型明确指定了应该更新的属性,因此您不需要冒更新更多属性的风险
  • 序列化:如果需要序列化,服务模型更合适(EF模型可能包括不需要的导航属性)
  • Update
    函数使用者不知道您正在使用的数据持久性库

看看这个答案,可能重复使用仅包含要修改的属性的DTO。或者手动复制这些值。我不会使用AM来实现业务规则,否则业务规则就会分散在各地。@Bit问题是,它们不是每次都需要忽略的相同属性。此对象在不同的UI页面上更新了不同的属性。如果说“如果要映射的属性为null,请别管它,不要更改它”,那就太好了@Gert我假设这就是您所说的业务逻辑,在如此低的级别上分散使用它确实很糟糕