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.