2010-10-15 7 views
5

System.DateTime peut prendre une plage de valeurs plus étendue que DateTime de SQL Server. Par conséquent il y a la classe System.Data.SqlTypes.SqlDateTime qui imite le plus tard.Entity Framework et les meilleures pratiques de débordement SqlDateTime

Par conséquent, je m'attendais à Entity Framework à choisir SqlDateTime, mais ce n'était pas le cas.

Mes questions sont ...

Quelles sont les meilleures pratiques pour assurer que vos valeurs DateTime ne causera pas de problèmes lorsque vous essayez de les enregistrer dans votre base de données?

Existe-t-il un moyen de forcer EF à utiliser SqlDateTime?

Répondre

4

Il y a un certain nombre de choses que vous pouvez faire:

  • si vous utilisez SQL Server 2008 ou plus récent, vous pouvez utiliser les DATE ou DATETIME2 types de données sur la base de données qui offrent la même plage de dates de .NET DateTime

  • si vous ne pouvez pas utiliser ces nouveaux types de données, il sera à vous de gérer une vérification/validation de vos champs de date avant que les choses sont stockées dans la mémoire persistante. EF EntityObject offre beaucoup de façons de puiser dans le processus de validation et de sauvegarde des objets - choisir une approche qui fonctionne pour vous

1

Peut-être que c'est un vieux fil, mais je affichera mes conclusions sur ce point pour les autres:

Disons que nous avons dev env: EF 5, CodeFirst, SQLCE 4.0:

public abstract class Entity : IEntity, IEquatable<Entity> 
{ 
public virtual int Id { get; protected set; } 
public virtual DateTime LastModified { get; set; } 

[DataType(DataType.Date)] 
public virtual DateTime CreatedOn { get; set; } 

[DataType(DataType.DateTime)] 
public virtual DateTime CreatedOn2 { get; set; } 

[DataType(DataType.Time)] 
public virtual DateTime CreatedOn3 { get; set; } 

public virtual DateTime CreatedOn4 { get; set; } 
} 

wi e un mappage personnalisé:

public EntityMapping() 
{ 
HasKey(e => e.Id); 
Property(e => e.Id); 
Property(e => e.LastModified).IsRequired().IsConcurrencyToken(); 
Property(e => e.CreatedOn).IsRequired(); 
Property(e => e.CreatedOn2).IsRequired(); 
Property(e => e.CreatedOn3).IsRequired(); 
Property(e => e.CreatedOn4).IsRequired(); 
} 

Ce produit this, ce qui signifie que nous aurons l'exception de débordement.

Modification des correspondances à ce tout en travaillant avec SQL CE 4.0:

Property(e => e.CreatedOn).IsRequired().HasColumnType("datetime2"); 
Property(e => e.CreatedOn2).IsRequired().HasColumnType("date"); 
Property(e => e.CreatedOn3).IsRequired().HasColumnType("date"); 
Property(e => e.CreatedOn4).IsRequired().HasColumnType("datetime2"); 

donne cette error. Passer à SQL Server Standart 2012 semble résoudre le problème (ce n'est pas une solution à coup sûr - juste pour l'expérience). Le schéma SQL Server créé est this.

Je ne suis pas un expert en Sql mais il me semble que SQL CE does not support these dates. le problème avec le développement env. restes. DateTime peut être substitué, mais peut apporter beaucoup de refactoring ici et là.

Rappelez-vous également que SqlDateTime and DateTime are very different. La solution que je trouve bonne - pour le code et pour le cycle de vie du projet - est de basculer entre LocalDb et SQL standart comme suggéré par l'un des liens ci-dessus de stackoverflow combiné avec les paramètres de mappage fluentApi pour égaliser la création du modèle ou les deux .

L'introduction du custom convention in EF en tant que filet de sécurité semble également très bien.

Si quelqu'un a une meilleure solution globale, pour le code et pour la production de dev, à la fois, postez-le.

Questions connexes