Entity framework 将仅具有更改字段的部分对象发送到Web API和实体框架

Entity framework 将仅具有更改字段的部分对象发送到Web API和实体框架,entity-framework,asp.net-web-api,model-binding,Entity Framework,Asp.net Web Api,Model Binding,WebApi和EF-poco一起工作得非常好。我一直在思考的一个问题是,随着时间的推移,一些物体会变得非常大。它们可以有许多属性映射回数据库中的列。对于这些对象,一次更新一个或两个以上的字段是很少见的,因此它回避了一个问题:为什么需要所有字段完成从客户机到服务器再到数据库的全过程 一些JavaScript框架提供了将所有字段还是仅更改的字段发送回服务器的选项,因此客户端是干净和简单的 从我所看到的来看,服务器端更具挑战性。序列化程序将介入并尝试将一些json或xml映射到一个类型。例如,JSON

WebApi和EF-poco一起工作得非常好。我一直在思考的一个问题是,随着时间的推移,一些物体会变得非常大。它们可以有许多属性映射回数据库中的列。对于这些对象,一次更新一个或两个以上的字段是很少见的,因此它回避了一个问题:为什么需要所有字段完成从客户机到服务器再到数据库的全过程

一些JavaScript框架提供了将所有字段还是仅更改的字段发送回服务器的选项,因此客户端是干净和简单的

从我所看到的来看,服务器端更具挑战性。序列化程序将介入并尝试将一些json或xml映射到一个类型。例如,JSON.NET可以很好地处理缺少的值,前提是对象中的相应属性可以为null

另一方面,将反序列化模型重新连接回实体框架是需要技巧的地方。控制器的默认WebApi模板在一行中完成:

db.Entry(user).State = EntityState.Modified;
这显然会将整个对象设置为“修改”。当然,可以将单个属性设置为modified而不是整个对象,我假设这意味着EF更聪明一些,只在SQL更新中发送修改后的属性

所以这里的问题是,我如何知道更新了哪些属性?我只在我的控制器方法中得到一个对象,所以我不能问序列化程序它拉入了什么属性(即使对于给定的序列化程序这是可能的)。 如果我有一个属性列表,那么我可以在EF中将当前值的状态设置为modified,希望这会导致我的cleandb查询

另一个可能更明显的选择是,首先从数据库中检索我要更新的对象,然后在检索到的对象上逐个修改已更改的属性,或者如果EF支持它,也许我可以将未附加的对象传递给它,并让它自己执行此操作。这并不是一个理想的选择,因为它意味着整个数据库的读取,而整个过程的重点是效率。我们要做的是用客户端的http效率和带宽换取服务器对数据库的命中率

因此,对我来说,如果我想在服务器上做这件事,我将处于一个艰难的境地。WebApi和EF完成了大部分工作,但牺牲了灵活性。我正在寻找我没有提到的选项或角度,希望有一个简单的解决方案,不会丢掉这两项伟大技术中的一项

我如何知道更新了哪些属性

我想你不会得到那个信息的。默认序列化程序不希望您了解任何详细信息。他们的功能就是给你一个对象,他们就是这么做的。如果您想知道详细信息,您必须自己进行反序列化—这意味着编写反序列化程序或在操作中接受原始消息并对其进行解析

您还可以尝试硬编码跟踪实体本身并“记录”在反序列化过程中设置的属性,但它取决于序列化程序是否可以工作,因为如果反序列化也设置了这些值,那么它将毫无用处

当您使用整个实体时,EF和WebAPI一起工作。一旦你开始使用部分数据传输,你必须在游戏中加入你自己的逻辑