Това е един от малкото проблеми, които са проблематични с Entity Framework. Да кажем, че имате клас, който изглежда така:
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; }
}
Сега искате да вмъкнете нов елемент:
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity())
}
Entity Framework знае как да обработва първичен ключ с автоматично нарастване поради дефиницията в EDMX. Няма да се опита да вмъкне стойност за Id
Имот. Въпреки това, що се отнася до Entity Framework, CreatedOn
има стойност:DateTime
по подразбиране . Тъй като Entity Framework не може да каже „добре, има стойност, но трябва да я игнорирам“, той активно ще вмъкне записа с CreatedOn
стойност на свойството, заобикаляйки стойността по подразбиране в дефиницията на вашата колона във вашата таблица.
Няма лесен начин да направите това. Можете или активно да зададете CreatedOn
свойство на DateTime.Now
когато поставите този елемент. Или можете да създадете двойка интерфейс и метод за разширение:
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())
}
Редактиране: За да разширим тази точка, причината, поради която това е неразрешим проблем, е поради значението зад autoincrement
поле и поле с default
стойностно ограничение. По дефиниция полето за автоматично нарастване трябва винаги да се обработва от сървъра, като се използва семе и всичко това. Не можете да посочите стойност за поле за автоматично нарастване на вмъкване освен ако сте използвали SET IDENTITY INSERT ON
. Стойността по подразбиране обаче е само намек, който гласи „ако не посоча никаква стойност, използвайте това“. Тъй като типовете стойности в .NET не могат да бъдат null, винаги ще има стойност и Entity Framework не може да заключи, че по подразбиране стойност за това поле по това време означава, че искате то да бъде по подразбиране на SQL сървъра.