ServiceStack ORMLite UpdateOnly故障

时间:2013-12-28 12:29:26

标签: c# sql servicestack ormlite-servicestack

我有一个对象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的屏幕截图

enter image description here

注意SQL Profiler说“Id”=“Id”?它应该是“Id”=“iNa7EKWjKkKMu ...”。我做错了什么?谢谢你的帮助。

EDIT ---------------------------------------------- ---------

感谢dasblinkenlight我得到了答案。

附注,我不同意ORMLite库UpdateOnly()item.Id视为文字“Id”的方式,并且没有使用其实际价值。

这意味着这个UpdateOnly()函数仅适用于硬编码字符串单元测试。它在实际使用中变得奇怪。

不确定是设计还是故障。

1 个答案:

答案 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没有可见性,所以除了将其值用作常量或为其引入参数外,它没有其他选择。