我有一个对象User
,其属性为LastLoggedIn
,以下是我为更新此字段而编写的代码:
using (var o = Conn.OpenDbConnection()) {
var onlyFields = (x => x.LastLoggedIn);
var where = (x => x.Id == item.Id);
return o.UpdateOnly(item, onlyFields, where);
}
我使用SQL Server Profiler来捕获输出语句,我得到了:
UPDATE "Users" SET "LastLoggedIn" = '20131228 11:39:31.441' WHERE ("Id" = "Id")
( Debug + SQL Profiler的屏幕截图)
注意SQL Profiler说“Id”=“Id”?它应该是“Id”=“iNa7EKWjKkKMu ...”。我做错了什么?谢谢你的帮助。
EDIT ---------------------------------------------- ---------
感谢dasblinkenlight我得到了答案。
附注,我不同意ORMLite库UpdateOnly()
将item.Id
视为文字“Id”的方式,并且没有使用其实际价值。
这意味着这个UpdateOnly()
函数仅适用于硬编码字符串单元测试。它在实际使用中变得奇怪。
不确定是设计还是故障。
答案 0 :(得分:3)
对我来说最可能的原因是ORMLite不会将item.Id
视为常量。它看到它是被更新对象的一部分,并使用其名称而不是其值。
您应该能够通过引入一个临时变量解决此问题,如下所示:
using (var o = Conn.OpenDbConnection()) {
var onlyFields = (x => x.LastLoggedIn);
vat itemId = item.Id;
var where = (x => x.Id == itemId);
return o.UpdateOnly(item, onlyFields, where);
}
现在ORMLite对itemId
没有可见性,所以除了将其值用作常量或为其引入参数外,它没有其他选择。