Dette er et af de få problemer, der er problematiske med Entity Framework. Lad os sige, at du har en klasse, der ser sådan ud:
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 vil du indsætte et nyt element:
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity())
}
Entity Framework ved, hvordan man håndterer en auto-increment primær nøgle på grund af definitionen i EDMX. Den vil ikke forsøge at indsætte en værdi for Id
ejendom. Men hvad angår Entity Framework, CreatedOn
har en værdi:standard DateTime
. Fordi Entity Framework ikke kan sige "godt, det har en værdi, men jeg bør ignorere det", vil det aktivt indsætte posten med CreatedOn
egenskabsværdi, der omgår standardværdien på din kolonnedefinition på din tabel.
Der er ingen nem måde at gøre dette på. Du kan enten aktivt indstille CreatedOn
egenskab til DateTime.Now
når du indsætter det element. Eller du kan oprette en grænseflade og et udvidelsesmetodepar:
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())
}
Rediger: For at uddybe dette punkt er grunden til, at dette er et uløseligt problem, på grund af betydningen bag en autoincrement
felt og et felt med en default
værdibegrænsning. Et auto-increment-felt skal pr. definition altid håndteres af serveren ved hjælp af et frø og al den jazz. Du kan ikke angive en værdi for et automatisk stigningsfelt på et indsæt medmindre du har brugt SET IDENTITY INSERT ON
. En standardværdi er dog kun et tip, der siger "hvis jeg ikke angiver nogen værdi, brug denne". Fordi værdityper i .NET ikke kan være null, vil der altid være en værdi, og Entity Framework kan ikke udlede, at standard værdi for det pågældende felt på det tidspunkt betyder, at du ønsker, at det skal være standard på SQL-serveren.