Ini adalah salah satu dari sedikit masalah yang bermasalah dengan Entity Framework. Katakanlah Anda memiliki kelas yang terlihat seperti ini:
public class MyEntity
{
// Id is a PK on the table with Auto-Increment
public int Id { get; set; }
// CreatedOn is a datetime, with a default value
public DateTime CreatedOn { get; set; }
}
Sekarang, Anda ingin memasukkan elemen baru:
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity())
}
Entity Framework mengetahui cara menangani kunci utama peningkatan otomatis karena definisi dalam EDMX. Itu tidak akan mencoba memasukkan nilai untuk Id
Properti. Namun, sejauh menyangkut Entity Framework, CreatedOn
memiliki nilai:DateTime
default . Karena Entity Framework tidak dapat mengatakan "baik, ia memiliki nilai tetapi saya harus mengabaikannya", itu akan secara aktif memasukkan catatan dengan CreatedOn
nilai properti, melewati nilai default pada definisi kolom di tabel Anda.
Tidak ada cara mudah untuk melakukan ini. Anda dapat secara aktif mengatur CreatedOn
properti ke DateTime.Now
saat Anda memasukkan item itu. Atau Anda dapat membuat antarmuka dan pasangan metode ekstensi:
public interface ICreatedOn
{
public DateTime CreatedOn { get; set; }
}
public partial class MyEntity : ICreatedOn
{
}
public static TEntity AsNew<TEntity>(this TEntity entity) where TEntity : ICreatedOn
{
if(entity != null)
entity.CreatedOn = DateTime.Now;
return entity;
}
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity().AsNew())
}
Sunting: Untuk memperluas poin ini, alasan mengapa ini menjadi masalah yang tidak dapat diselesaikan adalah karena makna di balik autoincrement
bidang dan bidang dengan default
kendala nilai. Bidang peningkatan otomatis harus, menurut definisi, selalu ditangani oleh server, menggunakan seed dan semua jazz itu. Anda tidak dapat menentukan nilai untuk bidang kenaikan otomatis pada sisipan kecuali Anda telah menggunakan SET IDENTITY INSERT ON
. Namun, nilai default hanyalah petunjuk yang mengatakan "jika saya tidak menentukan nilai apa pun, gunakan ini". Karena tipe nilai dalam .NET tidak boleh nol, akan selalu ada nilai dan Kerangka Entitas tidak dapat menyimpulkan bahwa default nilai untuk bidang itu, pada saat itu, berarti Anda ingin itu menjadi default di server SQL.