Detta är ett av få problem som är problematiska med Entity Framework. Säg att du har en klass som ser ut så här:
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 vill du infoga ett nytt element:
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity())
}
Entity Framework vet hur man hanterar en primärnyckel med automatisk ökning på grund av definitionen i EDMX. Den kommer inte att försöka infoga ett värde för Id
fast egendom. Men när det gäller Entity Framework, CreatedOn
har ett värde:standard DateTime
. Eftersom Entity Framework inte kan säga "ja, det har ett värde men jag borde ignorera det", kommer det aktivt att infoga posten med CreatedOn
egenskapsvärde, som förbigår standardvärdet i din kolumndefinition i tabellen.
Det finns inget enkelt sätt att göra detta. Du kan antingen aktivt ställa in CreatedOn
egenskapen till DateTime.Now
när du sätter in objektet. Eller så kan du skapa ett gränssnitt och ett förlängningsmetodpar:
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())
}
Redigera: För att expandera på denna punkt, anledningen till att detta är ett olösligt problem är på grund av innebörden bakom en autoincrement
fält och ett fält med default
värdebegränsning. Ett automatiskt inkrementfält ska per definition alltid hanteras av servern, med hjälp av ett frö och all den där jazzen. Du kan inte ange ett värde för ett automatiskt inkrementfält på en infogning om inte du har använt SET IDENTITY INSERT ON
. Ett standardvärde är dock bara en ledtråd som säger "om jag inte anger något värde, använd detta". Eftersom värdetyper i .NET inte kan vara null, kommer det alltid att finnas ett värde och Entity Framework kan inte sluta sig till att standard värde för det fältet vid den tiden betyder att du vill att det ska vara standard på SQL-servern.