0

我有使用 EF 和 Oracle Data Provider for .Net 的 OData 服务(WCF Data Services 5.6)。当我从服务跟踪查询到数据库服务器时,我发现即使我只修改了 1 列,UPDATE 也包含表中的所有列。例如 - 我可以有 5 列的表,在客户端修改 1 并调用 SaveChanges()。在服务器端,在 oracle 中我得到

更新 col1=x, col2=x,col3=x,col4=x WHERE ....

我在互联网上阅读了很多关于这个问题的信息,但仍然没有找到任何明确的解决方案。当然,我不是唯一一个遇到这个问题的人,但可能有人知道如何解决这个问题?

我看到 EF6 即将到来,WCF 数据服务团队为 EF6 发布了 Alpha,但是,首先它仍然是 alfa,EF6 是 RC,其次,它有一些问题,第三 - 不能保证同样的问题不存在新版本。

希望有人有正确的答案...

4

2 回答 2

1

好的,看来我至少喜欢一种方法来做到这一点。在 WCF 服务中,在 ChangeInterceptor 中:

  [ChangeInterceptor("Entity")]
        public void OnChange(Entity item, UpdateOperations operations)
        {
            Dictionary<string, object> changes = new Dictionary<string, object>();
            foreach (String propName in this.CurrentDataSource.Entry(item).CurrentValues.PropertyNames)
            {
                if (this.CurrentDataSource.Entry(item).Property(propName).IsModified)
                    changes.Add(propName, this.CurrentDataSource.Entry(item).Property(propName).CurrentValue);
            }
            this.CurrentDataSource.Entry(item).State = System.Data.EntityState.Unchanged;
            var arrayOfAllChangedProps = changes.Keys.ToArray();
            foreach(string prop in arrayOfAllChangedProps)
                this.CurrentDataSource.Entry(item).Property(prop).CurrentValue = changes[prop];
            return;
        }

我们得到修改后的值,将它们添加到字典中(可以是任何其他集合),然后重置修改状态的标志。如果在此之前重置标志,则我们无法获得更改。复位标志时,将当前值设置为在复位标志之前保存的值以进行修改。

在所有这些之后,我们将看到只有修改的列在 UPDATE 语句中。

我真的无法理解,为什么这不是默认行为?以及为什么要完成所有这些魔术。另外,我不知道这是否是正确的方法。但至少这对我有用。

于 2013-10-13T19:00:53.007 回答
0

它今天有效,我刚刚使用 EF5 和 DS5.6 在测试数据集上生成了这个 SQL 查询:

exec sp_executesql N'update [dbo].[People]
set [City] = @0
where ([Id] = @1)
',N'@0 nvarchar(max) ,@1 bigint',@0=N'Mashville',@1=1

OData查询:http://localhost:50000/People(1L)

OData 有效载荷:{ "City": "Mashville" }

也许您忘记使用 HTTPPATCH方法而不是PUT?

于 2013-10-15T16:35:51.697 回答