140 votes

Comment corriger l'erreur de conversion datetime2 out-of-range en utilisant DbContext et SetInitializer ?

J'utilise les API DbContext et Code First introduites avec Entity Framework 4.1.

Les modèle de données utilise des types de données de base tels que string y DateTime . La seule annotation de données que j'utilise dans certains cas est [Required] mais cela ne figure sur aucun des sites de l DateTime propriétés. Exemple :

public virtual DateTime Start { get; set; }

Les Sous-classe de DbContext est également simple et se présente comme suit :

public class EventsContext : DbContext
{
    public DbSet<Event> Events { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Event>().ToTable("Events");
    }
}

Les initialisateur fixe des dates dans le modèle à des valeurs raisonnables de cette année ou de l'année prochaine.

Cependant, lorsque j'exécute l'initialisateur, j'obtiens l'erreur suivante context.SaveChanges() :

La conversion de en un type de données da une valeur hors plage. [ ] a été interrompue.

Je ne comprends pas du tout pourquoi cela se produit, car tout est si simple. Je ne sais pas non plus comment résoudre ce problème puisqu'il n'y a pas de fichier edmx à éditer.

Des idées ?

0voto

Ahmad Moayad Points 11

Dans mon cas, cela s'est produit lorsque j'ai utilisé une entité et que la table sql a une valeur par défaut de datetime == getdate(). J'ai donc fait ce qu'il fallait pour donner une valeur à ce champ.

0voto

Sérgio Azevedo Points 21

J'utilise Database First et lorsque cette erreur m'est arrivée, ma solution a été de forcer ProviderManifestToken="2005" dans le fichier edmx (rendant les modèles compatibles avec SQL Server 2005). Je ne sais pas si quelque chose de similaire est possible pour Code First.

0voto

Howie Krauth Points 41

Une seule ligne permet de résoudre ce problème :

modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));

Dans mon code, j'ai donc ajouté :

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
}

L'ajout de cette ligne à la section override void OnModelCreating de la sous-classe DBContext devrait fonctionner.

0voto

GrayDwarf Points 743

Dans mon cas, après une refonte de EF6, mes tests échouaient avec le même message d'erreur que le post original, mais ma solution n'avait rien à voir avec les champs DateTime.

Il me manquait simplement un champ obligatoire lors de la création de l'entité. Une fois que j'ai ajouté le champ manquant, l'erreur a disparu. Mon entité comporte deux champs DateTime ? mais ils ne sont pas à l'origine du problème.

-1voto

Jon Roberts Points 379

Au cas où quelqu'un serait aussi stupide que moi, vérifiez l'année de votre date. Je convertissais une date à partir d'un fichier texte au format AAMMJJ et créais donc une date dont l'année était 0020 et non 2020. C'est une erreur évidente, mais j'ai passé plus de temps à la regarder sans la voir que je n'aurais dû !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X