J'ai le code suivant dans mon HomeController:
public ActionResult Edit(int id)
{
var ArticleToEdit = (from m in _db.ArticleSet where m.storyId == id select m).First();
return View(ArticleToEdit);
}
[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Article ArticleToEdit)
{
var originalArticle = (from m in _db.ArticleSet where m.storyId == ArticleToEdit.storyId select m).First();
if (!ModelState.IsValid)
return View(originalArticle);
_db.ApplyPropertyChanges(originalArticle.EntityKey.EntitySetName, ArticleToEdit);
_db.SaveChanges();
return RedirectToAction("Index");
}
Et voici la vue de la méthode Edit:
<% using (Html.BeginForm()) {%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="headline">Headline</label>
<%= Html.TextBox("headline") %>
</p>
<p>
<label for="story">Story <span>( HTML Allowed )</span></label>
<%= Html.TextArea("story") %>
</p>
<p>
<label for="image">Image URL</label>
<%= Html.TextBox("image") %>
</p>
<p>
<input type="submit" value="Post" />
</p>
</fieldset>
<% } %>
Lorsque j'appuie sur le bouton Soumettre, j'obtiens l'erreur: {"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."}
Des idées sur le problème? Je suppose que la méthode d'édition essaie de mettre à jour la valeur publiée dans la base de données vers la version modifiée, mais pour une raison quelconque, elle ne l'aime pas ... Bien que je ne vois pas pourquoi la date est impliquée car elle n'est pas mentionnée dans le méthode de contrôleur pour modifier?
asp.net-mvc
Cameron
la source
la source
modelBuilder.Entity<WorldInfo>().Property(d => d.CurrentTime).HasColumnType("datetime2");
Réponses:
Le problème est que vous utilisez
ApplyPropertyChanges
avec un objet de modèle qui n'a été rempli qu'avec des données dans le formulaire (titre, histoire et image).ApplyPropertyChanges
applique les modifications à toutes les propriétés de l'objet, y compris votre non initialiséDateTime
, qui est défini sur 0001-01-01, qui est en dehors de la plage de SQL ServerDATETIME
.Plutôt que d'utiliser
ApplyPropertyChanges
, je suggérerais de récupérer l'objet en cours de modification, de modifier les champs spécifiques que votre formulaire modifie, puis d'enregistrer l'objet avec ces modifications; de cette façon, seuls les champs modifiés sont modifiés. Alternativement, vous pouvez placer des entrées masquées dans votre page avec les autres champs renseignés, mais ce ne serait pas très convivial avec des modifications simultanées.Mettre à jour:
Voici un exemple non testé de mise à jour de certains champs de votre objet (cela suppose que vous utilisez LINQ to SQL):
la source
modifiedDate
c'est le nom de votre propriété)story.modifiedDate = DateTime.Now;
bit à mon code actuel? MerciIl s'agit d'une erreur courante que les gens rencontrent lors de l'utilisation d'Entity Framework. Cela se produit lorsque l'entité associée à la table en cours d'enregistrement a un champ datetime obligatoire et que vous ne le définissez pas avec une valeur.
L'objet datetime par défaut est créé avec une valeur de
01/01/1000
et sera utilisé à la place de null. Cela sera envoyé à la colonne datetime qui peut contenir des valeurs de date de1753-01-01 00:00:00
partir de, mais pas avant, conduisant à l'exception hors plage.Cette erreur peut être résolue en modifiant le champ de base de données pour accepter null ou en initialisant le champ avec une valeur.
la source
Msdn
Réponse: Je suppose que vous essayez de sauvegarder
DateTime
avec la valeur «0001/1/1». Il suffit de définir point d' arrêt et le déboguer, le cas échéant , puis remplacerDateTime
avecnull
date normale ou ensemble.la source
Celui-ci me rendait fou. Je voulais éviter d'utiliser une heure de date nullable (
DateTime?
). Je n'avais pas non plus la possibilité d'utiliser le type datetime2 de SQL 2008 (modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");
).J'ai finalement opté pour ce qui suit:
la source
Vous pouvez également résoudre ce problème en ajoutant au modèle (version Entity Framework> = 5)
la source
Si vous avez une colonne datetime et autorise null, vous obtiendrez cette erreur. Je recommande de définir une valeur à transmettre à l'objet avant .SaveChanges ();
la source
J'ai eu cette erreur après avoir changé mon modèle (code d'abord) comme suit:
à
Les lignes présentes avec une valeur nulle dans DateCreated ont provoqué cette erreur. J'ai donc dû utiliser l' instruction SQL UPDATE manuellement pour initialiser le champ avec une valeur standard.
Une autre solution pourrait être une spécification de la valeur par défaut du fichier.
la source
Dans mon cas, dans l'initialiseur de la classe que j'utilisais dans la table de la base de données, je ne définissais aucune valeur par défaut pour ma propriété DateTime, ce qui entraînait le problème expliqué dans la réponse de @Andrew Orsich. J'ai donc simplement rendu la propriété nullable. Ou j'aurais pu aussi lui donner DateTime.Now dans le constructeur. J'espère que ça aide quelqu'un.
la source
Il semble que vous utilisez le framework d'entité. Ma solution était de basculer toutes les colonnes datetime sur datetime2 et d'utiliser datetime2 pour toutes les nouvelles colonnes, en d'autres termes, faire en sorte que EF utilise datetime2 par défaut. Ajoutez ceci à la méthode OnModelCreating sur votre contexte:
Cela obtiendra tous les DateTime et DateTime? properties sur toutes les entités de votre modèle.
la source
J'ai eu le même problème, malheureusement, j'ai deux propriétés DateTime sur mon modèle et une propriété DateTime est nulle avant de faire SaveChanges.
Assurez-vous donc que votre modèle a une valeur DateTime avant d'enregistrer les modifications ou rendez-le nullable pour éviter les erreurs:
Donc, cela résout mon problème, c'est une question de s'assurer que la date de votre modèle est correcte avant de persister dans la base de données:
la source
Si vous utilisez la version Entity Framework> = 5, l'application de l'annotation [DatabaseGenerated (DatabaseGeneratedOption.Computed)] à vos propriétés DateTime de votre classe permettra au déclencheur de la table de base de données de faire son travail de saisie des dates de création d'enregistrement et de mise à jour d'enregistrement sans provoquer votre code Entity Framework pour bâillonner.
Ceci est similaire à la 6ème réponse, écrite par Dongolo Jeno et éditée par Gille Q.
la source
De plus, si vous ne connaissez pas une partie du code où l'erreur s'est produite, vous pouvez profiler une "mauvaise" exécution de sql en utilisant le profileur SQL intégré à mssql.
Un paramètre datetime incorrect affichera quelque chose comme ça:
la source
Ce problème se produit généralement lorsque vous essayez de mettre à jour une entité. Par exemple, vous avez une entité qui contient un champ appelé
DateCreated
qui est [Obligatoire] et lorsque vous insérez un enregistrement, aucune erreur n'est renvoyée mais lorsque vous souhaitez mettre à jour cette entité particulière, vous obtenez leVoici maintenant la solution:
Sur votre vue d'édition, c'est-
edit.cshtml
à- dire pour les utilisateurs MVC, tout ce que vous avez à faire est d'ajouter un champ de formulaire caché pour votreDateCreated
juste en dessous du champ caché pour la clé primaire des données d'édition.Exemple:
En ajoutant ceci à votre vue d'édition, vous n'aurez jamais cette erreur, je vous assure.
la source
Vous devez activer la valeur nulle pour votre variable de date:
la source
Essayez de rendre votre propriété nullable.
A travaillé pour moi.
la source
Si vous avez accès à la base de données, vous pouvez changer le type de colonne de la base de données de datetime à datetime2 (7) il enverra toujours un objet datetime et il sera enregistré
la source
Le modèle doit avoir une date / heure nullable. La méthode suggérée précédemment pour récupérer l'objet qui doit être modifié doit être utilisée à la place de ApplyPropertyChanges. Dans mon cas, j'avais cette méthode pour enregistrer mon objet:
Et puis en service, je récupère en utilisant:
Le code de service complet est le suivant:
la source
[Résolu] Dans Entity Framework Code First (mon cas), il suffit de changer
DateTime
pourDateTime?
résoudre mon problème.la source
Erreur: la conversion d'un type de données datetime2 en type de données datetime a abouti à une valeur hors plage.
Cette erreur s'est produite en raison de NOT attribuer une valeur par rapport à une colonne de date NOT NULL dans l' utilisation de SQL DB EF et a été résolu en attribuant la même chose.
J'espère que cela t'aides!
la source
Vous avez ce problème lors de la création de mes classes à partir de l'approche Database First. Résolu en utilisant simplement Convert.DateTime (dateCausingProblem) En fait, essayez toujours de convertir les valeurs avant de passer, cela vous évite des valeurs inattendues.
la source
vous devez faire correspondre le format d'entrée de votre champ de date au format d'entité requis qui est aaaa / mm / jj
la source