用 Entity Framework 与 Json.NET 实现数据的按需更新
http://www.cnblogs.com/dudu/archive/2011/04/03/entity_framework_json_net.html 上篇随笔中,我们留下了一个难题——如何将客户端浏览器通过ajax提交的json数据传递给一个已存在的实体对象(也就是将json数据赋值给实体对象对应的属性)。这样的话,Entity Framework就能自动发现哪些属性值发生了变化,在保存时,只将发生变化的属性值更新至对应的数据库字段。 需要注意的是这里提交的json数据中的属性是动态的,不一定包含实体对象的所有属性,比如:这次提交的是{"Title":"Hello World"},下次提交的是{"Title":"Hello World","Description":"This is a test."}。第一种情况对应的应用场景是,博客后台提供一个快速修改标题的功能,通过弹出层弹出一个修改标题的文本框完成修改。 在这里再强调一下Entity Framework如何实现按需更新。先给它一个修改前的实体对象,然后修改当前这个对象的属性值,EF才能跟踪所做的修改,并在保存时更新至数据库。 面对这个难题,你也许想到了这样一种方法。直接将json数据反序列化为实体对象(ASP.NET MVC的控制器可以自动完成这个反序列化),然后将这个对象的属性值复制给EF跟踪的实体对象。但是,你不知道这个反序列化出来的对象的哪些属性值是来自json数据的。全部复制也不可行,前面已经说明过json数据中的属性是动态的,这个反序列化出来的对象并不是完整的实体对象。如果强行全部复制,更新时,会造成json数据中未包含的属性的数据丢失。 我们采用的解决方法是:通过Json.NET获取json数据中的属性,然后通过反射去修改被EF跟踪的实体对象的对应的属性值。 下面我们通过代码示例说明一下我们的解决方法。 客户端浏览器中通过ajax提交json数据的js代码:
实际提交的json数据: {
postId
:
3560
jsonData
{"Title":"hello world","Description":"test"}
}
ASP.NET MVC Controller中的代码: [HttpPost]
代码很简单,只是对服务层的调用,然后服务器层再去调用业务逻辑层。
public JsonResult AjaxUpdatePost( int postId,255); line-height:1.5">string jsonData) { return Json(ServiceFactory.BlogEntryService.Update(postId,jsonData)); } 业务逻辑层中的代码:
class
BlogEntryManager
{ // 实体对象数据更新 bool Update( jsonData) { BlogPost originalPost GetBlogPost(postId); using (BlogDbContext context new BlogDbContext()) { context.BlogPosts.Attach(originalPost); JsonToObject(originalPost,jsonData); context.SaveChanges(); } true ; } Json数据复制给实体对象 private void JsonToObject(BlogPost post,0); line-height:1.5"> jsonData) { JObject jo JObject.Parse(jsonData); var postType post.GetType(); foreach (var proper in jo.Properties()) { postType.GetProperty(proper.Name).SetValue(post,( )proper.Value,255); line-height:1.5">null ); } } 获取修改前的实体对象 BlogPost GetBlogPost( entryId) { BlogDbContext()) { var result from p context.BlogPosts where p.ID == entryId && p.IsExist select p; result.FirstOrDefault(); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |