Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Entity Framework - les valeurs par défaut ne sont pas définies dans la table du serveur sql

C'est l'un des rares problèmes qui posent problème avec Entity Framework. Supposons que vous ayez une classe qui ressemble à ceci :

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; }
}

Maintenant, vous voulez insérer un nouvel élément :

using(var context = new YourContext()) 
{
    context.MyEntities.Add(new MyEntity())
}

Entity Framework sait comment gérer une clé primaire à incrémentation automatique en raison de la définition dans EDMX. Il n'essaiera pas d'insérer une valeur pour le Id propriété. Cependant, en ce qui concerne Entity Framework, CreatedOn a une valeur :la valeur par défaut DateTime . Parce qu'Entity Framework ne peut pas dire "eh bien, il a une valeur mais je devrais l'ignorer", il insérera activement l'enregistrement avec le CreatedOn valeur de la propriété, en contournant la valeur par défaut de votre définition de colonne sur votre table.

Il n'y a pas de moyen facile de le faire. Vous pouvez soit définir activement le CreatedOn propriété à DateTime.Now lorsque vous insérez cet élément. Ou vous pouvez créer une interface et une paire de méthodes d'extension :

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())
}   

Modifier : Pour développer ce point, la raison pour laquelle il s'agit d'un problème insoluble est due à la signification d'un autoincrement field et un champ avec un default contrainte de valeur. Un champ d'auto-incrémentation devrait, par définition, toujours être géré par le serveur, en utilisant une graine et tout ce bazar. Vous ne pouvez pas spécifier une valeur pour un champ d'auto-incrémentation sur une insertion sauf si vous avez utilisé SET IDENTITY INSERT ON . Une valeur par défaut, cependant, est juste un indice qui dit "si je ne spécifie aucune valeur, utilisez ceci". Étant donné que les types de valeur dans .NET ne peuvent pas être nuls, il y aura toujours une valeur et Entity Framework ne peut pas en déduire que le par défaut valeur pour ce champ, à ce moment-là, signifie que vous voulez qu'il soit par défaut sur le serveur SQL.