2013-04-30 20 views
11

bir datetime2 veri türü dönüştürülmesi bir denetleyiciniz:datetime veri tipi hata

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

bir model:

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; }} 
} 

ve bir görünüşüdür:

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

Çalıştırmayı denedim Hata iletisini aldım:

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

Model denetleyici görünümü, kopyalanan bire bir kitaptan oluşur.

EndTime alanına girmem gereken biçim nedir bu yüzden bu hatayı almayacağım?

+0

StartTime ve EndTime için kaydedilen değerleri kontrol ettiniz mi? –

cevap

20

Hata, bu değerleri doğru şekilde ayarlamadığınızdan, uygulama yerel ayarlarınıza bağlı olarak bunları ayarladığınızdan emin olmanızdır. (ör. en-GB için dd/mm/yyyy, en-US için mm/dd/yyyy).

Aynı zamanda veritabanı datetime2 sütunu kullanmak üzere ayarlanmış ve değil bir datetime kolon olmuştur benziyor.

yapabilirsiniz ya:

A) datetime

B'ye datetime2 den türünü değiştirmek için veritabanını değiştirme) yaparak, datetime2 olmak için Model türlerini değiştirin:

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

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

olarak EndTime yaparsanız sorunu çözmelisiniz db ayarlarını nasıl değiştirebilirim? –

+0

@AlexandraOrlov Veritabanınız önce kod iseniz, o nitelikleri uygulamak ve veritabanını yeniden oluşturmak iyi olmalıdır. – mattytommo

+0

Modelimde türü değiştirdim ve gg/aa/yyyy sürümünü kullandım. Hala db ayarlarını nasıl değiştirdiğimi anlamadım ama cevap için teşekkürler –

2

datetime2 datatype içeren sütunlarınız boş değerleri kabul eder. Eğer değilse, bu sütunlara bir değer atamadığınızda bu hatayı alabilirsiniz.

Varsayılan olarak, modeliniz null kullanılamaz özellikleri kullanmıyorsa CodeFirst, null olmayan sütunlar oluşturacaktır. Bu mülkleri null etiketine dönüştürebilirsiniz.

+0

modelinde görebileceğiniz gibi, herhangi bir kısıtlama yok. ve datatime2 sütunu nedir? –

+0

Veritabanı düzeyinde datetime2 veri türü olan sütun. Yazım hatası için üzgünüm. Veritabanı düzeyinde sütununuz boş değerleri kabul ediyor mu? –

+0

Hmm ... Emin değilim. Şu anda kitaptan öğrendiğim gibi, "kod ilk" sürümünü denedim, model oluşturdum: public class EbuyDataContext: DbContext { public DbSet Açık artırmalar {get; set; } ... –

0

Ayrıca bu problemi de gördüm.

datetime veri türü için bir datetime2 veri türü dönüşüm bir aldığı çok un yararlı hatadır dışı bir aralık değeri ile sonuçlandı.

aşağıdaki (Yukarıdaki örnekte) yapmak zorunda sorunu çözmek için:

Bir'den Paket Yöneticisi Konsolu bulabilirsiniz -> Araçlar -> Kütüphane Paket Yöneticisi -> Paket Yöneticisi Konsolu

Ben Paket Yöneticisi Konsolu Veritabanı Göçler etkin -> Taşıma Enable-

Sonra Kontrolör Class'ta aşağıdaki kodu eklendi:

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 <-- 
} 

Sonra Modeller Class'ta: -> (Kullanıcı Değiştir burada gider)-Göç ekle

Sonra Paket Yöneticisi bir veritabanı Update çalıştırın

[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); 
} 

Sonra Paket Yöneticisi Konsolu değişiklikler Veritabanı Ekle Konsol -> Güncelleme-Veritabanı

Onun Veri Veritabanı en yukarıdaki uygulamada doğru olduğunu görüyoruz olduğunu görmek önemlidir:

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

Bu hata inanılmaz derecede aptalca bir hatadır ama benim de dahil olmak üzere birçok insanı yakalamış görünüyor. Şimdi, bu hatanın neden oluştuğunu biliyorum, düzeltmenin ve etrafta dolaşmanın kolay olduğu, ancak MVC'nin son yayınlanmasında bu tür ortak bir sorunun neden giderilemeyeceği anlaşılıyor.

0

Hizmet katmanındaki iletişim varlığım için change_date öğesini eklemeye çalıştığımda benzer hatayı aldım. Sorun, denetleyiciden parametrenin eklenmesiyle çözüldü. Lütfen parametreyi Controller'dan eklemeyi deneyin.

12

EntityFramework'ı kullanırken, bağımsız bir DateTime üyesini DB'ye kaydetmeye çalıştığımda aynı sorunu yaşadım. Buradaki cevapları okudum ve üyenin null olarak ilan edilmesiyle çözülebileceğini öğrendim. Ben denedim ve işe yaradı! Yani burada ihtiyacı olanlar için, bir kod çırpıda:

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

ya da sadece bir değer atamak:

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

veya ilerleyen

public DateTime? MyDateTime { get; set; } 

Ben feryat gibi kullanabiliriz hiçbir şey olmamış gibi ... (

)
MyDateTime = DateTime.Now; 
+0

sahip olduğu SQL'i kullanması gerektiğini düşündüm. Bu benim için hile yaptı, IdentthUser modelime Birthdate alanı ekledim – Mikeware

0

DB'de DateCreated öğesinde varsayılan getdate() değeri vardı. EF'deki değeri ayarlamadım çünkü ihtiyacım olduğunu düşünmedim. Eklentideki EF aracılığıyla değeri girdikten sonra hata gider. Neden bu hata ilk etapta var? Bunu hiç anlamadım.

0

DateTime özelliğinin null değerine sahip olmasını ve ayrıca değerin kabul edilebilir aralık içinde olduğundan emin olmak için özellik doğrulama özelliğini kullanmanızı öneririm.

Tarih değerini doğrulamak için RangeAttribute öğesinden devralınan bir özel öznitelik oluşturdum.Kullanıcı, SqlDateTime (muhtemelen çünkü bir istemci tarafı tarih seçici konunun), aralığının dışında bir değer girerse

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

Ve sonra, o gibi o

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

gibi özellik kullanmak aşağıdaki gibi anlamlı bir hata mesajı alırsınız:

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

0

benim sistem alanları modelim düzgün tanımlanmış olmasına rağmen (created_on, modified_on) ile bu karşılaştım.

Sorunumun nedeni, engellenmiş özniteliği vs readonly kullanıyordu. Formlar, engelli giriş değerlerini denetleyiciye göndermez, bu da null değerine neden olur ve sonuçta min tarih/saat değeriyle sonuçlanır.

Yanlış:

<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> 

Sağ:

<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>