Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET如何在不手动设置每个属性的情况下更新记录?_C#_Asp.net Mvc_Api_Datacontext - Fatal编程技术网

C# ASP.NET如何在不手动设置每个属性的情况下更新记录?

C# ASP.NET如何在不手动设置每个属性的情况下更新记录?,c#,asp.net-mvc,api,datacontext,C#,Asp.net Mvc,Api,Datacontext,如果我有一个属性为100且已更改的对象怎么办 这将是可怕的代码,并容易丢失一些属性 是否有一种与手动更新记录不同的方法 ApplicationUser CurrentUser = db.Users.FirstOrDefault(x => x.Id == model.Id); CurrentUser.FirstName = model.FirstName; CurrentUser.LastName = model.LastName; CurrentUser.IsRSM = model.Is

如果我有一个属性为100且已更改的对象怎么办

这将是可怕的代码,并容易丢失一些属性

是否有一种与手动更新记录不同的方法

ApplicationUser CurrentUser = db.Users.FirstOrDefault(x => x.Id == model.Id);

CurrentUser.FirstName = model.FirstName;
CurrentUser.LastName = model.LastName;
CurrentUser.IsRSM = model.IsRSM;
CurrentUser.PhoneNumber = model.PhoneNumber;
CurrentUser.Email = model.Email;
CurrentUser.UserName = model.Email;
CurrentUser.Region = model.Region;
CurrentUser.Active = model.Active;

db.Entry(CurrentUser).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();

根据评论,有两种方法可以通过编程实现:

反射 汽车制造商 首先在应用程序启动时创建映射:

cfg.CreateMap<ApplicationUserViewModel, ApplicationUser>();
cfg.CreateMap();
然后执行映射:

_mapper.Map<ApplicationUserViewModel, ApplicationUser>(model, CurrentUser)
\u mapper.Map(型号,当前用户)

有第三种方法


  • 创建手动映射属性的映射方法。(没有“昂贵”的反映)
  • 为映射方法创建单元测试,验证所有属性设置是否正确且没有遗漏
通过测试,您将始终确保没有遗漏属性或将属性设置为用于它们的错误值。
通过测试,您可以重构您的方法,并使用Automapper的反射,您将始终“检查”属性是否正确映射。

您可以这样做

ApplicationUser CurrentUser = db.Users.FirstOrDefault(x => x.Id == model.Id);
Context.Entry(CurrentUser).CurrentValues.SetValues(ObjectBeingPassed);

在您的方法中,您需要期待从您的帖子中出现的记录,该记录将包含每个属性(ObjectBeingPassed)。

您可以使用反射迭代属性,或者使用AutoMapper为您执行此操作。查看AutoMapper,这可能是最好的选择。如果我有一个属性为100的对象发生了变化怎么办?如果将代码归咎于在一个类中创建这些属性的开发人员,这将是非常可怕的;)请注意,只有当属性名称始终相同(或者至少有相当数量的属性名称相同)时,这两种解决方案中的任何一种都会对您有很大帮助。对于每个具有不同名称的属性映射对,您仍然需要手动设置映射。(这不是Chris回答的缺点,而是无法自动猜测目标属性名称的逻辑结果)“创建手动映射属性的映射方法”您的第一步正是OP试图避免的。此外,由于OP担心忘记一个属性;什么使你认为他不会担心在单元测试中忘记一个属性?@Flater,当你想要添加或更新(重命名、更改类型等)属性时,你首先会将它添加到测试中。如果测试失败,您将更改映射方法,直到测试通过。这样做,您不会忘记任何属性。当您将用户输入映射到实体时,Main OP的关注点是维护—一段时间后,您将遇到这样的情况:您的模型属性不应该映射到实体。或者应该在映射之前对它们进行修改/规范化…“如果测试失败,您将更改映射方法,直到测试通过。”编写正确失败的测试本身意味着您必须测试所有属性是否已正确设置。正如我提到的,OP专门发布了这个问题,因为他担心忘记设置所有属性。您只是将问题从创建原始映射转移到创建单元测试;但问题仍然没有改变,没有得到解决。此外,在问题(或评论)中,OP没有提到他的主要关注点是维护现有代码;但问题仍然没有改变,也没有解决——OP担心在映射过程中会忘记某些属性。如果缺少某些属性,单元测试将通知您。是的-唯一的缺点是您需要编写“正确”的单元测试-但您只做了一次。问题仍然是OP害怕忘记属性。是否
a.Field=b.Field或者它是
Assert.AreEqual(a.Field,b.Field)
并不重要。任何一个都容易出现相同的开发人员错误。如果OP在同一个代码库中多次编写相同的映射(对于相同的类),我同意您的回答(因此可能会弄乱许多映射中的一个)。但这不是问题的一部分,因为它目前的措辞。
ApplicationUser CurrentUser = db.Users.FirstOrDefault(x => x.Id == model.Id);
Context.Entry(CurrentUser).CurrentValues.SetValues(ObjectBeingPassed);