2014-09-24 22 views
1

我在使用postgres 9.3的servicestack/ormlite 4.0.32。Ormlite中的DateTime字段的SQL Literal /關鍵字POCO

我在表中有幾個timestamp列(以及相應的POCO中相應的DateTime字段)。

如何使用SQL文字像NOW()CURRENT_TIMESTAMP等在ormlite POCO Insert()Update()方法?默認情況下,日期時間字段填充爲DateTime.Min

我不想使用數據庫觸發器,SQL文字(如NOW())是可取的。

回答

2

DateTime值不在Nullable<DateTime>將默認爲DateTime.Min當你InsertUpdate。因此,您應該將它們設置爲所需的值。

手動設置:

可以通過指定你想成爲DateTime.Now

db.Insert(new Person { Id = 1, FirstName = "John", CreatedDate = DateTime.Now }); 

使用OrmLite的插入/更新過濾器值的INSERT或UPDATE語句中做到這一點:

不過我懷疑你希望避免在插入或更新語句中自己執行此操作,這通常是使用OrmLite的插入/更新過濾器功能來處理的,可用於設置記錄創建和修改時間。

the documentation

public interface IAudit 
{ 
    DateTime CreatedDate { get; set; } 
    DateTime ModifiedDate { get; set; } 
    string ModifiedBy { get; set; } 
} 

OrmLiteConfig.InsertFilter = (dbCmd, row) => { 
    var auditRow = row as IAudit; 
    if (auditRow != null) 
     auditRow.CreatedDate = auditRow.ModifiedDate = DateTime.UtcNow; 
}; 

OrmLiteConfig.UpdateFilter = (dbCmd, row) => { 
    var auditRow = row as IAudit; 
    if (auditRow != null) 
     auditRow.ModifiedDate = DateTime.UtcNow; 
}; 

然後在你的數據庫表類:

public class MyTable : IAudit 
{ 
    // Your properties 
    ... 

    // The audit properties 
    DateTime CreatedDate { get; set; } 
    DateTime ModifiedDate { get; set; } 
    string ModifiedBy { get; set; } 
} 

當你插入/更新MyTable然後過濾器會自動更新的時間戳。

+0

感謝@Scott的詳細答案!不幸的是,它仍然不符合我的具體要求。服務消費者(主要是winforms)將遍佈各大洲 - 我不能相信技術上不那麼複雜的最終用戶(主要是低級醫療技術人員)保持系統時間同步。 – masroore 2014-09-25 04:47:55

+0

我認爲ormlite應該實現對SQL文字的支持 - 我已經搜索了文檔,但未能找到任何線索..無論如何,我已經在DB端實現了觸發器 - 但我希望能夠在客戶端找到更優雅的解決方案。感謝您提供有關OrmLite審覈過濾器的詳細信息! – masroore 2014-09-25 04:53:52

+0

是否有一個原因,我不會在我的POCO的構造函數中設置它,而不必在插入和更新時處理濾鏡? – Ellesedil 2016-07-20 23:14:02