sql >> Databasteknik >  >> RDS >> Sqlserver

Entity Framework - standardvärden ställs inte in i sql-servertabellen

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.



  1. Magento sql frågehjälp behövs med massiva frågor

  2. Uppdatera en annan tabell efter infogning med en trigger?

  3. SQL-fråga för speluthyrningswebbplats - spelleveransrapport

  4. SQL Server beroenden