sql >> Database teknologi >  >> RDS >> Sqlserver

Entity Framework - standardværdier angives ikke i sql-servertabellen

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.



  1. Vælg samme kolonne for forskellige værdier i en anden kolonne

  2. Opdater ekstern database ved kursusafslutning

  3. PostgreSQL:hvordan man installerer plpythonu-udvidelsen

  4. Hvorfor er IS NOT NULL falsk, når du tjekker en rækketype?