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

Le fournisseur Oracle Entity Framework ne stocke pas DateTime.Now avec des millisecondes

Ah ! Mon super collègue a eu une idée et ça a marché !

Dans notre code EF, nous avons essayé de mettre

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<EntityClass>().Property(p => p.TIMESTAMP).HasPrecision(6);
}

Et puis le DateTime.Now avec des millisecondes stockées dans la base de données

Mise à jour :il convient de mentionner comment je me suis retrouvé dans cette situation difficile

Construire la base de données avec Model First dans une application "test"

  1. Mon application doit fonctionner avec SQL Server et Oracle. Alors...
  2. J'ai commencé par concevoir ma base de données dans un diagramme EDMX
  3. Une fois le diagramme terminé, j'ai généré le DDL pour SQL Server.
  4. Pour une raison quelconque, le fournisseur Oracle EF n'a pas pu générer le DDL, j'ai donc apporté manuellement des modifications au DDL SQL Server afin qu'il soit correct d'un point de vue syntaxique

    1er problème - mon Oracle DDL utilisait une date au lieu d'un horodatage. Assurez-vous d'utiliser l'horodatage !!! DateTime dans Oracle ne stocke pas les millisecondes.

Utilisation de Code First à partir de la base de données pour la solution réelle

  1. Je voulais que l'application utilise l'approche Code First (juste ma préférence. Je pense que c'est plus facile à maintenir)
  2. Je me suis donc connecté à la base de données SQL Server et j'ai généré toutes mes classes à partir de ce schéma.
  3. J'ai réussi tous mes tests unitaires, puis j'ai décidé de le tester avec la base de données Oracle
  4. Même après être passé de DATE à Horodatage, j'avais toujours des problèmes avec les millisecondes entrantes.
  5. J'ai généré un autre modèle Code First dans une solution de studio visuel de test avec un TIMESTAMP(6) tapez dans Oracle, sauf quand j'ai regardé le OnModelCreating code, il n'a rien généré avec HasPrecision(6) il n'y avait pas non plus de décorateurs sur la propriété dans la classe C# POCO générée.
  6. J'ai remarqué si vous avez le HasPrecision(6) code dans votre OnModelCreating , le code d'abordCreateDatabase() créera en fait un Oracle TIMESTAMP(6) . Si vous ne le faites pas, le fournisseur Oracle EF utilisera DATE

Je pense que si vous adoptez l'approche Model First, vous pouvez définir des valeurs de précision dans le diagramme EDMX, mais j'ai entendu dire que c'était une mauvaise pratique.