sql >> Database >  >> RDS >> Sqlserver

Entity Framework - standaardwaarden worden niet ingesteld in de sql-servertabel

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.



  1. Hoe REGEXP werkt in MariaDB

  2. Wat zijn de voordelen van de modus only_full_group_by?

  3. Een aangepaste postgresql-parameter opvragen met SELECT-instructie

  4. date_sub ok met mysql, ko met postgresql