example - entity framework c#



Erreur 'datetime2' lors de l'utilisation de framework d'entité dans VS 2010.net 4.0 (11)

Obtenir cette erreur:

System.Data.SqlClient.SqlException: La conversion d'un type de données datetime2 en un type de données datetime a entraîné une valeur hors de portée.

Mon entité objecte toutes les lignes aux objets DB.

Je n'ai trouvé qu'une seule référence à cette erreur via Google:

Résultat Google

Après avoir lu ceci, je me souviens que nous avons ajouté 2 champs, puis mis à jour le modèle d'entité de VS 2010. Je ne suis pas sûr de ce qu'il veut dire par "codage à la main" les différences. Je n'en vois pas.

Tout ce que je fais dans le code est de remplir l'objet entité, puis de sauvegarder. (Je remplis aussi les nouveaux champs dans le code) J'ai peuplé le champ date avec DateTime.Now ..

La partie importante du code est la suivante: ctx.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

La base de données est SQL Server 2008.

Pensées?

Le reste de l'erreur:

à System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager stateManager, adaptateur IEntityAdapter) à System.Data.EntityClient.EntityAdapter.Update (IEntityStateManager entityCache) à System.Data.Objects.ObjectContext.SaveChanges (options SaveOptions) à SafariAdmin.Site.WebServices.SpeciesPost.SaveOrUpdateSpecies (String sid, Chaîne fieldName, String authToken) dans SpeciesPost.svc.cs: ligne 58 à SafariAdmin.TestHarness.Tests.Site.WebServices.SpeciesPostSVC_Tester.SaveNewSpecies () dans SpeciesPostSVC_Tester.cs: ligne 33 --SqlException à System.Data.SqlClient.SqlConnection.OnError (Exception SqlException, Boolean breakConnection) à System.Data.SqlClient.SqlInternalConnection.OnError (Exception SqlException, Boolean breakConnection) à System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () à System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject étatO bj) à System.Data.SqlClient.SqlDataReader.ConsumeMetaData () à System.Data.SqlClient.SqlDataReader.get_MetaData () à System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) à System.Data .SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean asynchrone) à System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, méthode String, résultat DbAsyncResult) à System.Data. SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, méthode String) à System.Data.SqlClient.SqlCommand.ExecuteReader (comportement CommandBehavior, méthode String) à System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (comportement CommandBehavior) à System.Data.Common.DbCommand.ExecuteReader (comportement CommandBehavior) à System.Data.Mapping.Update.Internal.DynamicUpdateComma nd.Execute (Traducteur UpdateTranslator, connexion EntityConnection, Dictionary 2 identifierValues, List 1 generatedValues) sur System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager stateManager, adaptateur IEntityAdapter)


Après avoir essayé de résoudre ce problème pendant plusieurs jours, j'ai utilisé DateTime? comme le type de données dans mon modèle avec Entity Framework Code-First au lieu de DateTime .


Assurez-vous qu'aucun des champs non null du DB (datetime) n'est omis lors de l'insertion / la mise à jour. J'ai eu la même erreur et lors de l'insertion de valeurs dans ces champs datetime, le problème a été résolu. Cela se produit si les champs datetime non null ne sont pas affectés d'une valeur correcte.


Deux solutions:

  • Déclarez les propriétés de votre classe comme ci-dessous et créez une base de données de mise à jour:

    public DateTime? MyDate {get; set;}
    
  • Ou définissez une date pour la propriété dans la méthode Seed qui remplit la base de données, pas besoin de update-database:

    context.MyClass.AddOrUpdate(y => y.MyName,new MyClass { MyName = "Random", MyDate= DateTime.Now })
    

Entity Framework gère toutes les dates comme Datetime2, donc, si vos champs dans la base de données sont Datetime, cela pourrait poser problème. Nous avons eu le même problème ici, et à partir de ce que nous avons trouvé, peupler tous les champs de date et de changer le type de données, sont les solutions les plus commom


J'ai eu le même problème et le résoudre en mettant l'attribut [Column(TypeName = "datetime2")] aux propriétés connexes, comme ci-dessous l'échantillon:

 [Column(TypeName = "datetime2")]
 public DateTime? PropertyName { get; set; }

Je sais que c'est une vieille question, mais comme je l'ai googlé ici, quelqu'un d'autre pourrait faire la même chose ;-) Pour ceux qui changent de DateTime en DateTime2 n'est pas une option (comme pour les utilisateurs SQL2005), je pense que dans la plupart des cas plus raisonnable de remplir les champs laissés vides avec quelque chose comme (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue
et pas avec DateTime.now, car il est plus facile de le reconnaître comme une valeur "pseudo-nulle" (et s'il est nécessaire de le convertir en un vrai null dans une classe partielle de l'objet père)


Lorsque vous utilisez d'abord le code cadre Entity, déclarez-le comme ceci:

public Nullable<System.DateTime> LastLogin { get; set; }

On avait le même problème. Ceci était lié à la version mssql. Nous l'avons fait fonctionner sur toute notre version avec cette méthode.

Ouvrez votre fichier edmx avec un éditeur xml Trouvez cette ligne en haut de votre fichier

<Schema Namespace="XXXXX.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008"

Remplacez le 2008 par 2005 Enregistrez votre fichier, recompilez le projet.

J'espère que cela aidera quelqu'un d'autre dans le futur.

J'ai seulement essayé cette solution avec une approche dbfirst.


Simple. Sur votre code d'abord, définissez le type de DateTime sur DateTime ?. Ainsi vous pouvez travailler avec le type DateTime nullable dans la base de données.


Tout ce qui correspond à un datetime rentrera dans un type de données datetime2, et inversement ce n'est pas le cas, vous pouvez coller une date de janvier 1500 dans un type de données datetime2 mais datetime ne date que de 1753, une colonne datetime2 peut remonter tous les chemin à l'année 1. Je vérifierais quelle est la date min que vous passez est et si vos tables ont des colonnes de type de données datetime2 ou datetime2


Utilisez ce script SQL pour convertir toutes les colonnes de datetime en datetime2 . Il saute toutes les tables contient 'aspnet' pour votre commodité.

DECLARE @SQL AS NVARCHAR(1024)
DECLARE @TBL AS NVARCHAR(255)
DECLARE @COL AS NVARCHAR(255)
DECLARE @NUL AS BIT

DECLARE CUR CURSOR FAST_FORWARD FOR
    SELECT  SCHEMA_NAME(t.schema_id)+'.'+t.name, c.name, c.is_nullable
    FROM    sys.tables AS t
    JOIN    sys.columns c ON t.object_id = c.object_id
    JOIN    information_schema.columns i ON i.TABLE_NAME = t.name 
                                        AND i.COLUMN_NAME = c.name
    WHERE   i.data_type = 'datetime' and t.name not like '%aspnet%'

    ORDER BY t.name, c.name

OPEN CUR
FETCH NEXT FROM CUR INTO @TBL, @COL, @NUL
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @SQL = 'ALTER TABLE ' + @TBL 
        + ' ALTER COLUMN [' + @COL + '] datetime2' 
        + (CASE WHEN @NUL=1 THEN '' ELSE ' NOT' END) + ' NULL;'
    EXEC sp_executesql @SQL
    FETCH NEXT FROM CUR INTO @TBL, @COL, @NUL
END

CLOSE CUR;
DEALLOCATE CUR;

Ça marche pour moi!