用 Entity Framework 与 Json.NET 实现数据的按需更新

转载 2012年03月29日 21:50:29

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代码:

function update_post() {
var post = {};
post.Title
= $.trim($("#txtTitle").val());
post.Description
= $.trim($("#txtDescription").val());
var jsonStr = JSON.stringify(post);
var entry = {};
entry.postId
= entryId;
entry.jsonData
= jsonStr;
$.ajax({
url:
'/admin/AjaxUpdatePost.aspx',
data: JSON.stringify(entry),
success: update_post_callback
});
}

实际提交的json数据:

{"postId":3560,"jsonData":"{\"Title\":\"hello world\",\"Description\":\"test\"}"}

ASP.NET MVC Controller中的代码:

[HttpPost]
public JsonResult AjaxUpdatePost(int postId, string jsonData)
{
return Json(ServiceFactory.BlogEntryService.Update(postId, jsonData));
}
代码很简单,只是对服务层的调用,然后服务器层再去调用业务逻辑层。

业务逻辑层中的代码:

public class BlogEntryManager
{
//实体对象数据更新
public bool Update(int postId, string jsonData)
{
BlogPost originalPost
= GetBlogPost(postId);
using (BlogDbContext context = new BlogDbContext())
{
context.BlogPosts.Attach(originalPost);
JsonToObject(originalPost, jsonData);
context.SaveChanges();
}
return true;
}
//Json数据复制给实体对象
private void JsonToObject(BlogPost post, string jsonData)
{
JObject jo
= JObject.Parse(jsonData);
var postType
= post.GetType();
foreach (var proper in jo.Properties())
{
postType.GetProperty(proper.Name).SetValue(post, (
string)proper.Value, null);
}
}
//获取修改前的实体对象
public BlogPost GetBlogPost(int entryId)
{
using (BlogDbContext context = new BlogDbContext())
{
var result
= from p in context.BlogPosts
where p.ID == entryId && p.IsExist
select p;
return result.FirstOrDefault();
}
}
}

译文:使用MVC5的Entity Framework 6入门(八)——为ASP.NET MVC应用程序更新相关数据

为ASP.NET MVC应用程序读取相关数据这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这...

MVC中使用EF(5):在 ASP.NET MVC 程序使用Entity Framework读取关联数据

在 ASP.NET MVC 程序使用Entity Framework读取关联数据 By Tom Dykstra|July 30, 2013 Translated by litdwg ...
  • litdwg
  • litdwg
  • 2013年10月04日 16:28
  • 4976

ADO.NET Entity Framework 之“无法加载指定的元数据资源。”

从ADO.NET Entity Framework发布以来,本人也一直在用,深感好用,忍不住地要感谢微软啊!由于项目结构创建完成后,没怎么改动过,所以一直没出题过问题,可最近由于改动了下命名空间,问题...

ASP.NET MVC3 实例(二) 使用 Entity Framework 创建实体数据模型

上篇中大体介绍了下 MVC3 以及项目的创建,本篇我们主要看看 MVC3 中实体数据模型的创建。我们创建项目时,使用的是 .NET 4,在 .NET 4 中我们可以使用 Entity Framewor...

为ASP.NET MVC应用创建Entity Framework数据模型(1/10)

原址:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity-framework-d...

[ASP.NET MVC]Entity Framework框架之CodeFirst数据迁移

修改原来的实体模型的结构,导致每次运行程序都报出这样的错误:”支持“XXX”上下文的模型已在数据库创建后发生更改,请考虑使用Code First迁移更新数据库……“,于是开始研究CodeFirst迁移...

ado.net entity framework使用不同的方法查询数据的不同性能

第一部分:重复查询单个实体   第一种:Linq To Entitiess   代码如下: !--   Code highlighting produced b...

译文:使用MVC5的Entity Framework 6入门(七)——为ASP.NET MVC应用程序读取相关数据

为ASP.NET MVC应用程序读取相关数据这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这...

ASP.NET MVC3 实例(二) 使用 Entity Framework 创建实体数据模型

上篇中大体介绍了下 MVC3 以及项目的创建,本篇我们主要看看 MVC3 中实体数据模型的创建。我们创建项目时,使用的是 .NET 4,在 .NET 4 中我们可以使用 Entity Framewor...
  • w678528
  • w678528
  • 2012年07月21日 10:03
  • 892

.NET基础篇——Entity Framework 数据转换层通用类

在实现基础的三层开发的时候,大家时常会在数据层对每个实体进行CRUD的操作,其中存在相当多的重复代码。为了减少重复代码的出现,通常都会定义一个共用类,实现相似的操作,下面为大家介绍一下Entity F...
  • educast
  • educast
  • 2012年06月20日 14:07
  • 744
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用 Entity Framework 与 Json.NET 实现数据的按需更新
举报原因:
原因补充:

(最多只允许输入30个字)