asp.net-mvc – MVC中具有存储库/ DTO模式的实体的部分更新(准备
发布时间:2020-12-16 09:38:40 所属栏目:asp.Net 来源:网络整理
导读:我已经构建了我的域模型层,我的存储库层,现在我正在处理我的DTO层以供webApi项目使用.我正在实现更新服务方法,我想知道部分更新.这是我的DTO课程: public class FullPersonDto { public FullPersonDto() { Friends = new ListPerson(); } public FullPerson
我已经构建了我的域模型层,我的存储库层,现在我正在处理我的DTO层以供webApi项目使用.我正在实现更新服务方法,我想知道部分更新.这是我的DTO课程:
public class FullPersonDto { public FullPersonDto() { Friends = new List<Person>(); } public FullPersonDto(Person person) { PersonId = person.PersonId; DateCreated = person.DateCreated; Details = person.Details; Friends = new List<Person>(); foreach (Person friend in person.Friends) { Friends.Add(new PersonDto(friend)); } } [Key] public int PersonId { get; set; } [Required] public virtual DateTime DateCreated { get; set; } public virtual string Details { get; set; } public List<Person> Friends { get; set; } public Person ToEntity() { var person = new Person { PersonId = PersonId,DateCreated = (DateTime) DateCreated,Details = Details,Friends = new List<Person>() }; foreach (PersonDto friend in Friends) { person.Friends.Add(friend.ToEntity()); } return person; } } 这是我的Repository中的Update方法: public Person UpdatePerson(Person person) { var entry = _db.Entry(person); if (entry.State == EntityState.Detached) { var dbSet = _db.Set<Person>(); Person attachedPerson = dbSet.Find(person.PersonId); if (attachedPerson != null) { var attachedEntry = _db.Entry(attachedPerson); attachedEntry.CurrentValues.SetValues(person); // what if values are null,like ID,or DateCreated? } else { entry.State = EntityState.Modified; } } SaveChanges(); return person; } 我的问题是:如果我只需要通过我的webAPI更新一个人的详细信息怎么办?是使用SetValues构造整个PersonDto和更新整个对象的约定,还是有任何方法可以指定我只需要更新单个字段,这样我就不必通过线路发送大量数据(我真的不需要)? 如果可以进行部分更新,何时更新整个实体是否有用?即使我必须更新5/7属性,它也要求我发送2/7的旧数据来重写,以便SetValues不会从我的DTO中将空值写入我的字段. 这里的任何帮助都会很棒……对这些东西来说是全新的,并试图正确地学习一切.谢谢. 解决方法
我采取了类似的方法来进行优化,并且在连接时我遇到了与null值相同的问题(不仅仅是null,你也会遇到布尔问题).这就是我想出来的:
public static void Update<T>(this DbContext context,IDTO dto) where T : class,IEntity { T TEntity = context.Set<T>().Local.FirstOrDefault(x => x.Id == dto.Id); if (TEntity == null) { TEntity = context.Set<T>().Create(); TEntity.Id = dto.Id; context.Set<T>().Attach(TEntity); } context.Entry(TEntity).CurrentValues.SetValues(dto); var attribute = dto.GetAttribute<EnsureUpdatedAttribute>(); if (attribute != null) { foreach (var property in attribute.Properties) context.Entry(TEntity).Property(property).IsModified = true; } } 这是DbContext的扩展方法.以下是IDTO和IEntity的接口: public interface IDTO { int Id { get; set; } } public interface IEntity { int Id { get; set; } Nullable<DateTime> Modified { get; set; } Nullable<DateTime> Created { get; set; } } 我正在使用我的自定义EnsureUpdatedAttribute来注释应始终更新哪些属性(以处理未跟踪的空值/默认值): public class EnsureUpdatedAttribute : Attribute { public IEnumerable<string> Properties { get; private set; } public EnsureUpdatedAttribute(params string[] properties) { Properties = properties.AsEnumerable(); } } 这是一个用法示例: public class Sample : IEntity { public int Id { get; set; } public string Name { get; set; } public bool Active { get; set; } public Nullable<DateTime> Modified { get; set; } public Nullable<DateTime> Created { get; set; } } [EnsureUpdated("Active")] /// requirement for entity framework change tracking,read about stub entities public class SampleDTO : IDTO { public int Id { get; set; } [Required] public string Name { get; set; } [JsonIgnore] /// How to exclude property from going on the wire / ignored for serialization public bool Active { get; set; } } [HttpPost] public HttpResponseMessage SaveSample(SampleDTO dto) { dto.Active = true; _ctx.AddModel<Sample>(dto); _ctx.SaveChanges(); return NoContent(); } return NoContent()只是返回204(NoContent)的扩展名. 希望这可以帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 带有transfer-enconding的POST:在IIS 8.5 Web
- asp.net – 在ajax调用中传递参数
- 如何设置文本框的值textmode = date ASP.NET C#
- asp.net 使用驻留在页面中的Cache缓存常用可定时更新的数据
- asp.net-mvc – ASP.NET MVC中具有动态数量的texbox的表单
- asp.net – ASP与SQL DB和VB代码背后.编辑返回的数据
- asp.net-mvc – 将{sitename}参数传递给MVC控制器操作
- Asp.net MVC json还是Json.net?
- asp.net-mvc – MvcHtmlString.Create()和Html.Raw()之间的
- asp.net-mvc-3 – 在ASP.NET MVC3 Intranet应用程序中获取登
推荐文章
站长推荐
- 在 Xunit 中使用依赖注入
- asp.net-mvc – 更改链接上的部分视图
- asp.net – .net 4.5 iis HighDensityWebHosting
- 为什么MVC 5 Owin Oauth没有点击/ Account/Exter
- entity-framework – 此版本的Entity Framework核
- asp.net – 使用谷歌地图api的ASP .NET
- asp.net-mvc – 实体框架4.1代码优先 – 在存储库
- ASP.NET学习CORE中使用Cookie身份认证方法
- 从Azure功能调用Asp.Net Web API端点
- asp.net – 如何为外部依赖项使用依赖注入?
热点阅读