Toto je jeden z mála problémů, které jsou u Entity Framework problematické. Řekněme, že máte třídu, která vypadá takto:
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; }
}
Nyní chcete vložit nový prvek:
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity())
}
Entity Framework ví, jak zacházet s automatickým přírůstkem primárního klíče díky definici v EDMX. Nepokusí se vložit hodnotu pro Id
vlastnictví. Nicméně, pokud jde o Entity Framework, CreatedOn
má hodnota:výchozí DateTime
. Protože Entity Framework nemůže říct „dobře, má hodnotu, ale měl bych ji ignorovat“, aktivně vloží záznam s CreatedOn
vlastnost value, čímž se vynechá výchozí hodnota v definici sloupce v tabulce.
Neexistuje jednoduchý způsob, jak to udělat. Můžete buď aktivně nastavit CreatedOn
vlastnost na DateTime.Now
když tuto položku vložíte. Nebo můžete vytvořit rozhraní a metodu rozšíření:
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())
}
Upravit: Abychom tento bod rozšířili, důvodem, proč se jedná o neřešitelný problém, je význam za autoincrement
pole a pole s default
hodnotové omezení. Pole automatického přírůstku by podle definice měl vždy zpracovávat server pomocí seedu a všeho toho jazzu. Nemůžete zadat hodnotu pro pole automatického přírůstku na vložení pokud použili jste SET IDENTITY INSERT ON
. Výchozí hodnota je však jen nápověda, která říká „pokud neurčím žádnou hodnotu, použijte tuto“. Protože typy hodnot v .NET nemohou být null, vždy tam bude hodnota a Entity Framework nemůže odvodit, že výchozí hodnota pro toto pole v tu chvíli znamená, že chcete, aby bylo na serveru SQL výchozí.