3

WebApi 和 EF POCO 可以很好地协同工作。我一直在思考的一个问题是,随着时间的推移,某些对象会变得非常大。它们可以有很多属性映射回数据库中的列。有了这些对象,一次更新一个或两个以上的字段是很少见的,所以这就引出了一个问题,为什么要求所有字段都完成从客户端到服务器再到数据库的完整行程。

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

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

另一方面,将反序列化模型重新附加到实体框架是事情变得棘手的地方。控制器的默认 WebApi 模板在一行中完成:

db.Entry(user).State = EntityState.Modified;

这显然将整个对象设置为已修改。当然可以将单个属性设置为修改而不是整个对象,我认为这意味着 EF 更聪明一些,并且只将修改后的属性发送回 SQL UPDATE 中。

所以这里的问题是,我怎么知道哪些属性被更新了?我只在我的控制器方法中得到一个对象,所以我不能询问序列化器它引入了哪些属性(即使对于给定的序列化器来说这是可能的)。如果我有一个属性列表,那么我可以将当​​前值及其状态设置为在 EF 中进行修改,并希望这会导致我的干净数据库查询。

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

所以对我来说,如果我想在服务器上执行此操作,我似乎处于困境和艰难的境地。WebApi 和 EF 完成了大部分工作,但以灵活性为代价。我正在寻找我没有提到的选项或角度,希望有一个简单的解决方案不会抛弃这两种伟大技术中的任何一种。

4

1 回答 1

5

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

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

您还可以尝试将一些跟踪硬编码到实体本身并“记录”在反序列化期间设置了哪些属性,但它是否会工作取决于序列化程序,因为如果反序列化也设置了这些值,它将无用。

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

于 2012-09-20T17:35:45.463 回答