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