Geçersiz kılınabilir bir DateTime alanının null olarak güncellenmesi varsayılan DateTime değeriyle sonuçlanır (0001-01-01 00: 00: 00.0000000)

0

Soru

Kullanıyorum ASP.NET Projemde ef6'yı ORM olarak kullanan MVC (Çekirdek değil) şablonunu kaynatın. Veritabanı SQL Server Express'tir.

İşte varlık nesnem (ilişkili olmayan özellikleri göz ardı ederek):

public class Asset : AggregateRoot<long>
{
    [DataType(DataType.DateTime)]
    public DateTime? LastControlTime { get; set; }
}

Yeni bir Varlık oluşturduğumda, bu alan uygun şekilde NULL olarak oluşturulur. Yani, her şey ilk başta amaçlandığı gibi çalışır. Ancak bir nesneyi basit bir servis çağrısı ile güncellemeye çalıştığımda, berbat olur.

İşte uygulama hizmeti sınıfındaki yöntem:

public void ResetLastControlTime (EntityDto<long> input)
{
    var asset = Repository.Get(input.Id);
    asset.LastControlTime = default(DateTime?);
}

Bu, bu alanı null olarak sıfırlamalıdır. Ayrıca denedim asset.LastControlTime = null;. Ama sonunda veritabanındaki o alana "0001-01-01 00: 00: 00.0000000" yazıyor. Kodda boş bir değer için kontrol ettiğim birçok yer var, bu yüzden şimdi tonlarca eski dosyayı değiştirmek zorunda kaldım ya da bu alanı basitçe BOŞ olarak sıfırlamanın bir yolunu bulmalıyım.

Burada benzer soruları kontrol ettim ancak bir cevap bulamıyorum. Hepsi zaten sahip olduğum nullable Datetime'ı anlatıyor. SQL server tablo şemasında, Veri Türü datetime2(7) sanırım bu da doğru. Oh ve veri türü ek açıklamasını silmek de hiçbir şeyi değiştirmedi.

Peki burada neyi kaçırıyorum? Sorunu bulmak için neyi kontrol etmeliyim?

1

En iyi cevabı

2

Sanırım her şey başarısız olursa, özelliği yeniden uygulayarak kodunuzun çoğunu basitleştirebilirsiniz:

public class Asset : AggregateRoot<long>
{
    public DateTime? _LastControlTime;
    [DataType(DataType.DateTime)]
    public DateTime? LastControlTime { 
      get {
        return _LastControlTime;
      }
      set {
        if (value == DateTime.MinValue) {
          _LastControlTime = null;
        } else {
          _LastControlTime = value;
        }
    }
}

Bu gerçekten sorunun özünü kesmez, ancak tüm == null ve değiştirmek zorunda kalmadan ilerlemenize izin verir .Tüm program boyunca değeri vardır.

2021-11-23 11:44:25

İşe yaradı! Dolayısıyla sorun, Depo ile ORM boilerplate kodu arasında bir yerde yatıyor ve null değerini minimum datetime'a dönüştürüyor gibi görünüyor. Ne olduğunu bilmiyorum ama şu an umursamayacak kadar meşgulüm. Bu basit çözüm için çok teşekkür ederim.
Emre Can Serteli

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................