2012-09-25 57 views
1

我正在使用C#中的MVC 3應用程序,該程序在更新表中的條目時遇到問題。實體框架發送錯誤日期以更新語句

正從EF稱爲更新字符串被髮送的日期作爲這樣(在所有其他值where語句爲清楚起見刪除)

where [CreateDate] = '2012-09-24 19:12:08' 

實際的數據庫條目的日期和SQL數據類型是datetime2(7):

2012-09-24 19:12:08.6457698 

當代碼執行日期不匹配,沒有更新。我使用現有數據庫中的反向工程代碼優先創建了我的模型。這裏是我的型號:

public class NPost 
{ 
    [HiddenInput(DisplayValue = false)] 
    public int NPostID { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public System.Guid UserId { get; set; } 

    [Required(ErrorMessage = "Please enter a title!")] 
    [StringLength(Int32.MaxValue)] 
    public string Title { get; set; } 

    [AllowHtml] 
    [Required(ErrorMessage = "Please enter the body of the post!")] 
    [StringLength(Int32.MaxValue)] 
    public string Body { get; set; } 

    [Required(ErrorMessage = "Please enter at least one tag!")] 
    [StringLength(Int32.MaxValue)] 
    public string Tags { get; set; } 

    public System.DateTime CreateDate { get; set; } 
    public Nullable<System.DateTime> PublishDate { get; set; } 
    public Nullable<double> Rating { get; set; } 

    [Required(ErrorMessage = "Please enter a topic!")] 
    [StringLength(Int32.MaxValue)] 
    public string Topic { get; set; } 

    [StringLength(Int32.MaxValue)] 
    public string TitleImage { get; set; } 

    [StringLength(Int32.MaxValue)] 
    public string ListingImage { get; set; } 

    [StringLength(Int32.MaxValue)] 
    public string BoxImage { get; set; } 

    public virtual aspnet_Users aspnet_Users { get; set; } 
} 

我需要做些什麼才能使這些日期排隊和正常工作?

+4

爲什麼地球上你用時間戳來匹配這些值?如果兩行在同一秒內插入,會怎麼樣? –

+0

時間戳不是唯一標識符。我只是刪除了所有其他語句。 –

+0

該日期來自EF正在使用的地方? – BNL

回答

1

我同意其他人對你在這裏做什麼表示的警告。但是,我們也應該直接回答你的問題!我懷疑EF將您的列視爲SQL datetime值,而不是新的datetime2類型。所以請嘗試以下。

您可以使用屬性中的[Column(TypeName = "datetime2")]屬性指示要使用的確切數據庫類型,如果您更喜歡流利配置,則可以使用HasColumnType方法。

0

在日期上做精確匹配似乎很容易出錯。實體框架通常應該根據主鍵進行更新,例如,其中NPostId = 50.您可以更改控制器中的更新以基於ID嗎?

var postById = context.Posts.Where(p => p.NPostId == id).First(); 
postById.Text = text; 
... 
context.Entry(postById).State = EntityState.Modified; 
postById.SaveChanges(); 
+0

我會如何指定更新的基礎? –

+0

如果有人從列表中選擇帖子,請確保將ID傳遞給控制器​​,這是常規慣例。然後你可以通過ID獲得Post實體,並根據它進行更新。將用示例更新帖子。 – Turnkey

+0

由於代碼完成的映射首先創建了一個使用表中所有列的鍵,因此已成爲唯一標識符問題。解決這個問題解決了這個問題。 –

-1

如果您使用時間戳作爲唯一標識符,則必須保證沒有兩個項目可以具有相同的時間值。如果這真的是你想要做的,將CreateDate表列的精度設置爲datetime2(0)並在該列上設置一個唯一鍵。

無論其...

亞倫的角度來看,使用時間戳作爲一個唯一的標識符可能不是一個好主意。請改用自動增量字段或uniqueidentifier(GUID類型)字段。

+0

查看我的其他評論。日期不是唯一標識符。 –