Dit is een van de weinige problemen die problematisch zijn met Entity Framework. Stel dat je een klas hebt die er als volgt uitziet:
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; }
}
Nu wil je een nieuw element invoegen:
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity())
}
Entity Framework weet hoe om te gaan met een auto-increment primaire sleutel vanwege de definitie in de EDMX. Er wordt niet geprobeerd een waarde in te voegen voor de Id
eigendom. Wat Entity Framework betreft, CreatedOn
heeft een waarde:de standaard DateTime
. Omdat Entity Framework niet kan zeggen "nou, het heeft een waarde, maar ik zou het moeten negeren", zal het de record actief invoegen met de CreatedOn
eigenschapswaarde, waarbij de standaardwaarde in uw kolomdefinitie in uw tabel wordt omzeild.
Er is geen gemakkelijke manier om dit te doen. U kunt de CreatedOn
. actief instellen eigenschap naar DateTime.Now
wanneer u dat item invoert. Of u kunt een interface en een extensiemethode-paar maken:
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())
}
Bewerken: Om op dit punt uit te breiden, de reden waarom dit een onoplosbaar probleem is, is vanwege de betekenis achter een autoincrement
veld en een veld met een default
waarde beperking. Een auto-increment-veld moet per definitie altijd worden afgehandeld door de server, met behulp van een seed en al die jazz. U kunt geen waarde specificeren voor een auto-increment veld op een invoeging tenzij je hebt SET IDENTITY INSERT ON
. gebruikt . Een standaardwaarde is echter slechts een hint die zegt "als ik geen waarde opgeef, gebruik deze". Omdat waardetypen in .NET niet null kunnen zijn, zal er altijd een waarde zijn en kan Entity Framework niet concluderen dat de default waarde voor dat veld, op dat moment, betekent dat u wilt dat het standaard wordt ingesteld op de SQL-server.