2013-04-30 53 views
11

Tôi có một bộ điều khiển:Việc chuyển đổi một kiểu dữ liệu datetime2 đến một datetime kiểu dữ liệu Lỗi

[HttpPost] 
public ActionResult Create(Auction auction) 
{ 
    var db = new EbuyDataContext(); 
    db.Auctions.Add(auction); 
    db.SaveChanges(); 
    return View(auction); 
} 

Một mô hình:

public class Auction 
{ 
     public long Id { get; set; } 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public decimal StartPrice { get; set; } 
     public decimal CurrentPrice { get; set; } 
     public DateTime StartTime { get; set; } 
     public DateTime EndTime { get; set; }} 
} 

Và một cái nhìn:

@model Ebuy.Website.Models.Auction 
@using (Html.BeginForm()) 
{ 
    <p> 
     //All the information fields... 
     @Html.LabelFor(model => model.EndTime) 
     @Html.EditorFor(model => model.EndTime) 
    </p> 
} 

Khi Tôi cố gắng chạy nó tôi nhận được lỗi:

The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.

Mô hình-bộ điều khiển-xem là từ một cuốn sách được sao chép một-một.

Tôi cần nhập định dạng nào vào trường EndTime để tôi không gặp lỗi này?

+0

Bạn đã kiểm tra các giá trị đang được lưu cho StartTime và EndTime chưa? –

Trả lời

20

Lỗi này là do bạn chưa thực sự đặt chính xác các giá trị đó, hãy đảm bảo bạn đặt chúng tùy thuộc vào ngôn ngữ ứng dụng của bạn. (ví dụ: dd/mm/yyyy cho en-GB, mm/dd/yyyy cho en-US).

Nó cũng giống như cơ sở dữ liệu của bạn đã được thiết lập để sử dụng một cột datetime2không một cột datetime.

Bạn có thể:

A) Sửa đổi cơ sở dữ liệu để thay đổi kiểu từ datetime2 để datetime

B) Thay đổi các loại trong Model của bạn sẽ được datetime2, bằng cách thực hiện:

[Column(TypeName = "DateTime2")] 
public DateTime StartTime { get; set; } 

[Column(TypeName = "DateTime2")] 
public DateTime EndTime { get; set; } 
+0

làm cách nào tôi có thể sửa đổi cài đặt db? –

+0

@AlexandraOrlov Nếu cơ sở dữ liệu của bạn là mã đầu tiên, sau đó áp dụng các thuộc tính đó và tái tạo cơ sở dữ liệu sẽ ổn. – mattytommo

+0

Tôi đã thay đổi loại trong mô hình của mình và sử dụng phiên bản dd/mm/yyyy. Tôi vẫn không hiểu làm thế nào tôi có nghĩa vụ phải sửa đổi các thiết lập db nhưng nhờ câu trả lời –

2

Các cột của bạn có kiểu dữ liệu datetime2 chấp nhận giá trị null hay không. Nếu không thì bạn có thể gặp lỗi này khi bạn không gán giá trị cho các cột này.

Theo mặc định, CodeFirst sẽ tạo các cột không có giá trị rỗng nếu mô hình của bạn không sử dụng các thuộc tính không có giá trị. Hãy thử chuyển đổi các thuộc tính này thành datetime không thể thực hiện được.

+0

như bạn có thể thấy trong mô hình, tôi không có bất kỳ hạn chế nào. và cột datatime2 là gì? –

+0

Đây là cột có datatype datetime2 ở cấp cơ sở dữ liệu. Xin lỗi vì lỗi đánh máy. Cột cấp cơ sở dữ liệu của bạn có chấp nhận các giá trị null không? –

+0

Hmm ... Tôi không chắc chắn. Khi tôi tìm hiểu nó ngay bây giờ từ cuốn sách, tôi đã thử phiên bản "mã đầu tiên", đã tạo một mô hình: lớp công khai EbuyDataContext: DbContext { công khai DbSet Đấu giá {get; bộ; } ... –

0

Tôi cũng đã xảy ra sự cố này.

Việc chuyển đổi một kiểu dữ liệu datetime2 đến một kiểu dữ liệu datetime dẫn đến một giá trị out-of-range là một lỗi rất un-hữu ích mà một nhận được.

Để giải quyết vấn đề tôi phải làm như sau (Sử dụng ví dụ trên):

Người ta có thể tìm ra Package Manager Console từ -> Tools -> Thư viện Package Manager -> Package Manager Console

tôi kích hoạt Migrations Cơ sở dữ liệu trong Package Manager Console -> Enable-Migrations

sau đó thêm đoạn code dưới đây trong lớp điều khiển:

public class Auction 
{ 
public long Id { get; set; } 
public string Title { get; set; } 
public string Description { get; set; } 
public decimal StartPrice { get; set; } 
public decimal CurrentPrice { get; set; } 

// My Edit to the code Start --> 
public Nullable<DateTime> StartTime { get; set; } 
public Nullable<DateTime> EndTime { get; set; }} 
// My Edit to the code Finish <-- 
} 

Sau đó, trong mô hình lớp:

[HttpPost] 

// My Edit to the code Start --> 
[DataType(DataType.Date)] 
[DisplayFormat(ApplyFormatInEditMode=true, DataFormatString = "{0:d}")]] 
// My Edit to the code Finish <-- 

public ActionResult Create(Auction auction) 
{ 

// My Edit to the code Start --> 
if(ModelState.IsValid) 
{ 
// Only Apply the DateTime if the Action is Valid... 
auction.StartTime = DateTime.Now; 
} 
// My Edit to the code Finish <-- 

var db = new EbuyDataContext(); 
db.Auctions.Add(auction); 
db.SaveChanges(); 
return View(auction); 
} 

Sau đó Thêm vào Cơ sở dữ liệu những thay đổi trong Package Manager Console -> Add-Migration (Thay đổi của bạn vào đây)

Sau đó chạy một Cập nhật cơ sở dữ liệu trong Package Manager Bảng điều khiển -> Update-Cơ sở dữ liệu

của nó quan trọng để thấy rằng các dữ liệu mà cơ sở dữ liệu thấy là đúng trong việc thực hiện trên:

E.G: 17/06/2013 12:00:00 AM 

Lỗi này là một lỗi ngu ngốc đáng kinh ngạc nhưng có vẻ như đã bắt được rất nhiều người trong đó có cả bản thân tôi. Bây giờ tôi biết tại sao lỗi này xảy ra có vẻ như nó rất dễ dàng để sửa chữa và có được xung quanh nhưng tại sao một vấn đề phổ biến sẽ không được cố định trong bản phát hành cuối cùng của MVC là ngoài hiểu của tôi.

0

Tôi gặp lỗi tương tự khi tôi đang cố gắng thêm change_date vào thực thể liên hệ của tôi trong lớp dịch vụ. Vấn đề đã được giải quyết bằng cách thêm tham số từ bộ điều khiển. Vui lòng thử thêm tham số từ Bộ điều khiển.

12

Tôi đã gặp vấn đề tương tự khi tôi cố lưu một thành viên DateTime chưa được tăng tốc vào DB, trong khi sử dụng EntityFramework. Tôi đã đọc câu trả lời ở đây và tôi đã học được rằng câu trả lời có thể được giải quyết bằng cách tuyên bố thành viên là không có giá trị. Tôi đã thử và nó đã hoạt động! Vì vậy, đây là một snap mã, cho những người cần nó:

public Nullable<DateTime> MyDateTime { get; set; } 

hoặc

public DateTime? MyDateTime { get; set; } 

Sau đó tôi có thể sử dụng nó như dưới đây:

if(MyDateTime.HasValue) 
{ 
    DoBlaBla(MyDateTime.Value); 
} 

hoặc chỉ gán giá trị cho nó giống như không có gì xảy ra ...

MyDateTime = DateTime.Now; 
+0

Điều này đã làm cho tôi, khi tôi thêm một trường ngày sinh vào mô hình IdentityUser của tôi – Mikeware

0

Tôi đã có một giá trị mặc định getdate() trên DateCreated trong DB. Tôi đã không đặt giá trị trong EF bởi vì tôi không nghĩ rằng tôi cần. Một khi tôi vượt qua trong giá trị thông qua EF trên chèn sau đó lỗi đã biến mất. Tại sao lỗi đó ở nơi đầu tiên? Tôi chưa bao giờ nghĩ ra điều đó.

0

Tôi khuyên bạn nên tạo thuộc tính DateTime không có giá trị và cũng sử dụng xác thực thuộc tính để đảm bảo giá trị nằm trong phạm vi có thể chấp nhận được.

Tôi đã tạo thuộc tính tùy chỉnh được kế thừa từ RangeAttribute để xác thực giá trị ngày.

public class DbDateRangeAttribute 
    : RangeAttribute 
{ 
    public DbDateRangeAttribute() 
     : base(typeof(DateTime), SqlDateTime.MinValue.Value.ToShortDateString(), SqlDateTime.MaxValue.Value.ToShortDateString()) 
    { } 
} 

Và sau đó bạn sử dụng thuộc tính như thế

[DbDateRange] 
public DateTime? StartTime { get; set; } 

Như vậy, nếu người dùng nhập vào một giá trị bên ngoài phạm vi của SqlDateTime (có thể là vì một ngày client-side vấn đề chọn), ông sẽ nhận được thông báo lỗi có ý nghĩa như sau:

The field StartTime must be between 1/1/1753 12:00:00 AM and 12/31/9999 12:00:00 AM.

0

Tôi đã chạy với trường hệ thống của mình (created_on, modified_on) mặc dù mô hình của tôi đã được xác định chính xác.

Nguyên nhân gây ra sự cố của tôi là sử dụng thuộc tính bị vô hiệu hóa so với chỉ đọc. Các biểu mẫu sẽ không gửi các giá trị đầu vào bị vô hiệu cho bộ điều khiển dẫn đến giá trị null, do đó, dẫn đến giá trị ngày/giờ tối thiểu.

sai:

<div class="form-group"> 
    @Html.LabelFor(model => model.CreatedOn, htmlAttributes: new { @class = "control-label col-lg-3" }) 
    <div class="col-lg-9"> 
     @Html.EditorFor(model => model.CreatedOn, new { htmlAttributes = new { @class = "form-control", disabled="disabled" } }) 
     @Html.ValidationMessageFor(model => model.CreatedOn, "", new { @class = "text-danger" }) 
    </div> 
</div> 

Bên phải:

<div class="form-group"> 
    @Html.LabelFor(model => model.CreatedOn, htmlAttributes: new { @class = "control-label col-lg-3" }) 
    <div class="col-lg-9"> 
     @Html.EditorFor(model => model.CreatedOn, new { htmlAttributes = new { @class = "form-control", @readonly="readonly" } }) 
     @Html.ValidationMessageFor(model => model.CreatedOn, "", new { @class = "text-danger" }) 
    </div> 
</div> 
Các vấn đề liên quan