À l'aide de DateTime propriétés dans le Code-Première Entity Framework et SQL Server
J'ai un exemple de classe book
:
public class Book
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public DateTime DateAdded { get; set; }
}
Lorsque je tente d'ajouter une nouvelle book
à la BookDb
contexte...
using (BookDb db = new BookDb())
{
Book book = new Book {
Name = "Some name",
DateAdded = DateTime.Now
};
db.Books.Add(book);
db.SaveChanges();
}
... une erreur est levée:
Système.Les données.SqlClient.SqlException: La conversion d'un datetime2 de données
de type pour un type de données datetime entraîné dans une gamme de valeur. L'
la déclaration a été résilié.
J'ai trouvé que la cause de cela est incompatible datetime
types entre .NET et SQL Server. Il est une façon de dire EF à l'utilisation de SQL Server format traditionnel Entity Framework, mais comment puis-je le faire dans Code-Première Entity Framework?
Je suis en utilisant EF4 sur .NET 4 (MVC 3 web app) et SQL Server 2008 Express.
- Avez-vous de régler l'horloge de votre ordinateur à quelque chose comme l'an 1750 ou plus tôt?
- Non, le temps est correct.
- Je n'étais pas grave : -) Voir ma réponse.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez spécifier le type d'API Fluent:
Cela crée un
datetime2(7)
colonne dans la base de données. Si vous souhaitez affiner la précision que vous pouvez utiliser:... pour un
datetime2(0)
colonne dans la base de données.Toutefois, le code que vous avez indiqué dans votre question fonctionne parce que les
datetime
type permet de stocker remonte aux alentours de 1750. L'exception se produit uniquement pour les dates antérieures. Une raison courante pour cette exception est un non initialiséeDateTime
bien parce qu'il représente l'année 0001 qui ne peuvent pas être stockées dans undatetime
colonne dans SQL Server.Il n'y a pas d'attribut correspondant à la définir avec des annotations de données. Il est seulement possible avec l'API Fluent.
DateAdded
bien initialisé correctement dans mon exemple de code?DateTime
propriété dans votre modèle de test qui n'est pas initialisé? Si non, alors c'est une chose bizarre. Je suis en utilisantdatetime
colonnes assez souvent etDateTime
propriétés ne sont jamais un problème lorsqu'il est initialisé avecNow
. J'avais testé votre exemple hier pour me convaincre à nouveau, et il n'a pas lever une exception.Lors de l'enregistrement d'une date, il doit avoir une valeur peuplée. C'est pourquoi vous obtenez cette erreur.
Suffit d'utiliser
DateTime?
. Il n'est pas nécessaire pour que la magie ci-dessus.Book
classe, je suis en train deDateAdded
àDateTime.Now
. N'est pas la valeur efficacement peuplées, ou ai-je raté quelque chose?DateAdded
n'était pas, en fait, d'être ensemble. Et à l'aide d'un nullable champ, tout en étant utile pour prévenir les oublis de la mine de tirer des erreurs, n'ont pas satisfait aux exigences de ma demande. +1 pour une bonne suggestion si.Vous pouvez annoter l'attribut de ta classe avec le type de datetime2.
Si les migrations sont activées, vous pouvez également régler des trucs à droite.