2015-01-21 69 views
3

將datetime2數據類型轉換爲日期時間數據類型導致超出範圍值。將datetime2數據類型轉換爲日期時間數據類型導致超出範圍的值 - 不使用DateTime2

我的應用程序最近開始顯示這個錯誤,這很奇怪,因爲它工作得更早。我在「Word」模型中沒有更改任何與DateTime相關的內容。當我將新模型添加到我的項目時開始發生。

當我嘗試編輯數據時顯示服務器錯誤。創建和刪除工作正常。

控制器:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include = "ID,UsersLanguage,OtherLanguage,Notes")] Word word, int idOfCollection) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(word).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index", new { idOfCollection = idOfCollection }); 
     } 
     return View(word); 
    } 

型號:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Linq; 
using System.Web; 

namespace WebLanguageTeacher.Models.MyDatabase 
{ 
    public class Word 
    { 
     public int ID { get; set; } 
     [MinLength(2, ErrorMessage = "Wydaje mi się, że słowo powinno mieć przynajmniej 2 litery ;)")] 
     [DisplayName("Język Użytkownika")] 
     [Required] 
     public string UsersLanguage { get; set; } 
     [MinLength(2, ErrorMessage = "Wydaje mi się, że słowo powinno mieć przynajmniej 2 litery ;)")] 
     [DisplayName("Inny język")] 
     [Required] 
     public string OtherLanguage { get; set; } 
     [DisplayName("Notatki")] 
     public string Notes { get; set; } 
     [DisplayName("Ostatnia powtórka")] 
     public DateTime LastReviewed { get; set; } 
     [DisplayName("Następna powtórka")] 
     public DateTime NextReview { get; set; } 
     [DefaultValue(0)] 
     [DisplayName("Przerwa między powtórkami")] 
     public int ReviewInterval { get; set; } /*W miejsce Difficulty*/ 

     [DisplayName("Nazwa właściciela")] 
     public string OwnerName { get; set; } 
     public virtual Collection Collection { get; set; } 

     [NotMapped] 
     public bool ModifyReview { get; set; } /* Klient przesyła tylko za ile dni będzie następna powtórka, serwer sam generuje datę*/ 

     public Word(){ 
      ModifyReview = false; 
     } 
    } 
} 

有什麼不對?我不創建任何DateTime2變量,那麼爲什麼我的應用程序試圖將DateTime2轉換爲DateTime?

我使用ASP.net MVC與EntityFramework。

+0

可能重複http://stackoverflow.com/questions/1331779/c-sharp-conversion-of-a-datetime2-data- type-to-datetime-data-type) – Arion 2015-01-21 08:02:58

+0

在調用SaveChanges()之前,LastReviewed和NextReview的實際值是多少? – haim770 2015-01-21 08:04:31

+0

某些日期時間字段在數據庫中可以爲空? – 2015-01-21 08:10:41

回答

1
  • 日期時間範圍:1753年1月1日, - 12月31日,9999

  • DATETIME2範圍:0001-01-01 - 9999-12-31

使用下面的代碼爲了避免衝突。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Word>().Property(o => o.NextReview).HasColumnType("datetime2"); 
} 
+0

爲什麼我必須這樣做這種奇怪的方式?我不能在創建變量時以某種方式聲明它嗎?像「public DateTime2 LastReviewed {get; set;}」 – Piotrek 2015-01-21 16:42:54

+0

我應該在哪裏粘貼這段代碼? – Piotrek 2015-01-21 16:44:36

+0

在你的DBContext類中。 https://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext.onmodelcreating%28v=vs.113%29.aspx – 2015-01-22 07:03:37

0

使日期時間可以爲空,您需要明確強制它們。就像屬性「LastReviewed」爲空,你應該像下面那樣聲明它。

[DisplayName("Ostatnia powtórka")] 
public DateTime? LastReviewed { get; set; } 

同其他日期時間變量,如果他們可以爲空

+0

但是我沒有想要使其可空。我需要設置它,這是這裏最重要的變量之一。 – Piotrek 2015-01-21 16:30:46

+0

默認情況下,如果你想給它賦值,那麼給它賦值Min值,如果你賦值,但它沒有正確映射,那就是爲什麼會發生這個錯誤... – 2015-01-22 10:07:16

2

DateTime對象默認爲DateTime.MinValue時,它的價值未明確設置。

因此,您的模型中沒有設置DateTime對象,並且缺省情況下(如上所述)超出了DateTime dbtype範圍,因此EntityFramework將其轉換爲DateTime2 dbtype,它然後導致數據庫中的轉換錯誤。

要解決此問題,請檢查模型中的所有DateTime對象,並確保它們設置的不是DateTime.MinValue。如果你不想將值設置爲任何值,那麼使這個字段在你的數據庫和你的模型中都是可空的,並且事情可以工作

注意,在db列上設置默認值並不能解決這個問題,轉換髮生得太早,您必須明確設置值

+0

並告訴我:它爲什麼早些時候工作? :d – Piotrek 2015-01-21 16:38:00

0

如果您不希望更改日期時間字段(以及您不想修改的所有其他字段),則需要保留舊值。爲此,從數據庫中檢索舊實體,只需更改編輯表單中更新的字段。例如:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit([Bind(Include = "ID,UsersLanguage,OtherLanguage,Notes")] Word word, int idOfCollection) 
{ 
    if (ModelState.IsValid) 
    { 
     var dbWord = db.Words.Find(word.ID); 
     dbWord.UsersLanguage = word.UsersLanguage; 
     dbWord.OtherLanguage = word.OtherLanguage; 
     dbWord.Notes = word.Notes; 

     db.SaveChanges(); // in this case dbWord is saved so datetime fields remains intact 
     return RedirectToAction("Index", new { idOfCollection = idOfCollection }); 
    } 
    return View(word); 
} 
0

讓你通過日期時間後加一個問號屬性爲空。

public DateTime? SentOn { get; set; } 
[一個DATETIME2數據類型的C#轉換爲日期時間數據類型](的
相關問題