2014-09-23 41 views
1

我正在編寫一些測試來檢查驗證過程是否按預期工作並且遇到非常奇怪的行爲。無法使用DateTime.Now在EntityFramework 6.1中使用Code First方法檢索記錄

內的測試方法:

DateTime now = DateTime.Now; 
using(CustomDbContext db = new CustomDbContext()) 
{ 
    Object1 o1 = new Object1(); 
    o1.CompletedOn = now; 
    db.Object1s.Add(o1); 
    db.SaveChanges(); 

    var query = from obj in db.Object1s 
       where obj.CompletedOn == now 
       select obj; 

    Assert.AreNotEqual(query.Count(), 0); 
} 

那一刻我這樣做:

DateTime now = DateTime.Now; 
using(CustomDbContext db = new CustomDbContext()) 
{ 
    Object1 o1 = new Object1(); 
    o1.CompletedOn = now; 
    db.Object1s.Add(o1); 
    db.SaveChanges(); 


    DateTime now2 = now.AddSeconds(-1); 
    var query = from obj in db.Object1s 
       where obj.CompletedOn > now2 
       select obj; 

    Assert.AreNotEqual(query.Count(), 0); 
} 

它的工作。

在正常情況下,我認爲now認爲參考DataTime.Now,因此時間會改變。但是,調試器表明情況並非如此。在兩種情況下通過的時間是相同的,結果存儲在數據庫中。

我使用代碼優先方法構建數據庫,這是什麼Object1:我使用SQL Server作爲我的數據庫

class Object1 
{ 
    [Key] 
    public int Object1ID { get; set; } 

    [Required] 
    public DateTime CompletedOn { get; set; } 
} 

。這有什麼關係嗎?

的值可以存儲在SQL Server看起來像這樣的:2014年9月23日13:14:18.157

+1

日期時間,並因此DateTime.Now()不參考系,它是一個基於值結構 - HTTP:// msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx – 2014-09-23 10:45:02

+0

其中obj.CompletedOn> now2 – Donal 2014-09-23 10:45:28

+0

@MikeMiller是的,我想通了,這就是爲什麼我問這個問題。兩次都應該是相同的,但我無法從數據庫中檢索結果。 – 2014-09-23 10:48:49

回答

0

使用SQL事件探查器查看正在通過發送什麼具體的日期時間,你會看到存儲值和參數值之間的差異。

0

上面的代碼不起作用,因爲由於某些未知原因,數據庫中存儲的值與DateTime中的參數給出的值之間存在大約+/- 10毫秒的差異。

因此,而隨後使用:

DateTime now2 = now.AddSeconds(-1); 

我可以使用:

DateTime now2 = now.AddMilliseconds(-10); 
相關問題