datetime2データ型をdatetimeデータ型に変換すると、範囲外の値が発生しました


174

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");
}

そして、これは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>

<% } %>

送信ボタンを押すと、エラーが発生します。{"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."}何か問題はありますか?editメソッドがDBのポストされた値を編集済みに更新しようとしていると想定していますが、何らかの理由でそれを好みません...編集用のコントローラーメソッド?


1
modelBuilder.Entity<WorldInfo>().Property(d => d.CurrentTime).HasColumnType("datetime2");
アンソニーニコルズ

回答:


166

問題はApplyPropertyChanges、フォーム(見出し、記事、画像)のデータのみが入力されたモデルオブジェクトを使用していることです。 SQL Serverの範囲外である0001-01-01に設定されているApplyPropertyChanges、初期化されていないを含む、オブジェクトのすべてのプロパティに変更を適用しますDateTimeDATETIME

使用するのではなく ApplyPropertyChangesでは、変更中のオブジェクトを取得し、フォームが編集する特定のフィールドを変更して、それらの変更を加えてオブジェクトを保存することをお勧めします。このようにして、変更されたフィールドのみが変更されます。別の方法として、他のフィールドに値を入力して、非表示の入力をページに配置することもできますが、これは同時編集にはあまり適していません。

更新:

これは、オブジェクトの一部のフィールドを更新するだけのテストされていないサンプルです(これは、LINQ to SQLを使用していることを前提としています)。

var story = _db.ArticleSet.First(a => a.storyId == ArticleToEdit.storyId);
story.headline = ArticleToEdit.headline;
story.story = ArticleToEdit.story;
story.image = ArticleToEdit.image;
story.modifiedDate = DateTime.Now;
_db.SubmitChanges();

非常に役に立ちました:)日付を指定していなかったのになぜ日付が変更されたのか疑問に思いました。EditPropertyを変更して、ApplyPropertyChangesを使用しないようにすることはできますか?私はASP.NETを初めて使用するので、現時点ではそれを完全には理解していません。パルありがとう。
Cameron

たとえば、日付を現在の日付に設定したい場合はどうすればよいですか。記事が更新された日時?それがおそらく最良のオプションであり、私が実際に使用しているApplyPropertyChangesで動作すると思います。
Cameron、

私の編集を参照してください(それがmodifiedDateあなたのプロパティの名前であると想定しています)
Jacob

私のアプリではSubmitChangesが機能しません:/ story.modifiedDate = DateTime.Now;現在のコードにビットを追加することはできますか?おかげで
キャメロン

1
このエラーは、パブリックDateTimeではなくパブリックDateTime CreatedDateを設定したときに発生しますか?CreatedDate。DateTimeをnullにすることはできないため、範囲外エラーが発生する理由。役立つかもしれませんが、私の問題は解決しました。
adnan

115

これは、Entity Frameworkを使用するときによくあるエラーです。これは、保存されるテーブルに関連付けられているエンティティに必須の日時フィールドがあり、値を設定していない場合に発生します。

デフォルトの日時オブジェクトは、の値で作成01/01/1000され、nullの代わりに使用されます。これは、日付の値を保持できる日時列に送信されます1753-01-01 00:00:00、前からではなく以降の範囲外の例外が発生します。

このエラーは、データベースフィールドを変更してnullを受け入れるか、フィールドを値で初期化することで解決できます。


3
これは、データベースの日時フィールドがオプションであり、値が設定されていない場合に発生します。そのため、これは一般的な人々のエラーではありません。これはEFアーキテクチャの問題の1つです。
GSoft Consulting 2015

1
EFがDBで型を確認し、それに応じて調整するか、またはより正確なエラーをスローするか、少なくともスローすることに同意する プラス面としては、通常のオプションの代わりに2つのオプションを提供したので、私はあなたの答えを気に入っています。最小値でファイルを初期化します。
DanteTheSmith

43

DATETIME1753/1/1から "eternity"(9999/12/31)をDATETIME2サポートし、0001/1/1からeternity を サポートします。

MSDN

回答:DateTime「0001/1/1」という値で 保存しようとしていると思います。それは、そうであれば、次に置き換えるだけでセットブレークポイントとデバッグDateTimenullまたは集合正常な日付。


コントローラには何を入れますか?デバッグすると、上記で投稿したエラーが表示されます。ありがとう。
Cameron

ここでエラーのようです-> _db.SaveChanges(); あなたは...この行の前にブレークポイントを設定することができます
アンドリューOrsich

そうそう。次に、それらはSaveChangesのエラーであるため、InnerExceptionを確認し、投稿されたエラーが原因であると表示しているため、エラーになります。
Cameron

_db.SaveChanges();の前にDateTime値を確認しましたか?と呼ばれていました?それは「1753/1/1」より素晴らしいはずです。
Andrew Orsich、2011年

originalArticleの日付値は{18/10/2009 00:00:00}であり、ArticleToEditの日付値は{01/01/0001 00:00:00}であるため、日付をすべての最初の日付に変更しようとしているようですフォーマットは同じなので、エラーがスローされる理由を説明しませんか?
Cameron

14

これは私を夢中にさせていました。null可能な日付時刻(DateTime?)を使用したくありませんでした。SQL 2008のdatetime2タイプ(modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");)を使用するオプションもありませんでした。

私は最終的に以下を選択しました:

public class MyDb : DbContext
{
    public override int SaveChanges()
    {
        UpdateDates();
        return base.SaveChanges();
    }

    private void UpdateDates()
    {
        foreach (var change in ChangeTracker.Entries<MyEntityBaseClass>())
        {
            var values = change.CurrentValues;
            foreach (var name in values.PropertyNames)
            {
                var value = values[name];
                if (value is DateTime)
                {
                    var date = (DateTime)value;
                    if (date < SqlDateTime.MinValue.Value)
                    {
                        values[name] = SqlDateTime.MinValue.Value;
                    }
                    else if (date > SqlDateTime.MaxValue.Value)
                    {
                        values[name] = SqlDateTime.MaxValue.Value;
                    }
                }
            }
        }
    }
}

10

モデルに追加することでこの問題を修正することもできます(Entity Frameworkバージョン> = 5)

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreationDate { get; set; }

8

datetimeでnullを許可する列がある場合、このエラーが発生します。.SaveChanges();の前にオブジェクトに渡す値を設定することをお勧めします。


5

次のようにモデルを変更した後(コードを最初に)、このエラーが発生しました。

public DateTime? DateCreated

public DateTime DateCreated

DateCreatedにnull値を含む行があると、このエラーが発生しました。だから私は使用しなければならなかった、標準値でフィールドを初期化するために、SQL UPDATEステートメントを手動で必要がありました。

別の解決策は、フィールドのデフォルト値の指定です。


3

私の場合、データベースのテーブルで使用していたクラスの初期化子で、DateTimeプロパティにデフォルト値を設定していなかったため、@ Andrew Orsichの回答で説明されている問題が発生しました。そのため、プロパティをnullに設定できるようにしました。または、コンストラクタでDateTime.Nowを指定することもできます。それが誰かを助けることを願っています。


3

エンティティフレームワークを使用しているようです。私の解決策は、すべてのdatetime列をdatetime2に切り替え、新しい列にはdatetime2を使用することでした。つまり、EFがデフォルトでdatetime2を使用するようにしました。これをコンテキストのOnModelCreatingメソッドに追加します。

modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));

それはすべてのDateTimeとDateTimeを取得しますか?モデル内のすべてのエンティティのプロパティ。


2

同じ問題がありましたが、残念ながら、モデルに2つのDateTimeプロパティがあり、SaveChangesを実行する前に1つのDateTimeプロパティがnullです。

したがって、変更を保存する前にモデルにDateTime値があることを確認するか、エラーを防ぐためにモデルをnullにできるようにします。

public DateTime DateAdded { get; set; }   //This DateTime always has a value before persisting to the database.
public DateTime ReleaseDate { get; set; }  //I forgot that this property doesn't have to have DateTime, so it will trigger an error

したがって、これは私の問題を解決します。データベースに永続化する前に、モデルの日付が正しいことを確認するという問題です。

public DateTime DateAdded { get; set; }
public DateTime? ReleaseDate { get; set; }

2

Entity Frameworkバージョン> = 5を使用している場合、[DatabaseGenerated(DatabaseGeneratedOption.Computed)]アノテーションをクラスのDateTimeプロパティに適用すると、データベーステーブルのトリガーが、レコードの作成と更新の日付を入力するというジョブを実行できます。 Entity Frameworkコードをギャグに。

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime DateCreated { get; set; }

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime DateUpdated { get; set; }

これは、Dongolo Jenoによって書かれ、Gille Qによって編集された6番目の回答に似ています。


1

また、エラーが発生したコードの一部がわからない場合は、mssqlに統合されているSQLプロファイラーを使用して、「不良」なSQL実行のプロファイルを作成できます。

不正な日時パラメーターはそのようなものを表示します:

悪いパラメータ


1

この問題は通常、エンティティを更新しようとしたときに発生します。たとえば、あなたが呼ばれるフィールドが含まれていたエンティティDateCreatedである[必須]とあなたが得る、特定のエンティティことをUpdateにあなたは、レコードを挿入し、エラーが返されませんが、お好きな時に

datetime2変換が範囲外エラーです。

これが解決策です:

編集ビュー、つまりedit.cshtmlMVCユーザーの場合DateCreated、編集データの主キーの非表示フィールドのすぐ下に、非表示フォームフィールドを追加するだけです。

例:

@Html.HiddenFor(model => model.DateCreated)

これを編集ビューに追加すると、間違いなくそのエラーは発生しません。



0

プロパティをnull可能にしてみてください。

    public DateTime? Time{ get; set; }

私のために働いた。


0

DBにアクセスできる場合は、DB列のタイプをdatetimeからdatetime2(7)に変更できます。これにより、datetimeオブジェクトが送信され、保存されます。


0

モデルにはnull許容の日時が必要です。ApplyPropertyChangesの代わりに、以前に提案された、変更する必要があるオブジェクトを取得する方法を使用する必要があります。私の場合、オブジェクトを保存するこのメソッドがありました:

public ActionResult Save(QCFeedbackViewModel item)

そして、サービス中、私は次を使用して取得します:

RETURNED = item.RETURNED.HasValue ? Convert.ToDateTime(item.RETURNED) : (DateTime?)null 

サービスの完全なコードは次のとおりです。

 var add = new QC_LOG_FEEDBACK()
            {

                QCLOG_ID = item.QCLOG_ID,
                PRE_QC_FEEDBACK = item.PRE_QC_FEEDBACK,
                RETURNED = item.RETURNED.HasValue ? Convert.ToDateTime(item.RETURNED) : (DateTime?)null,
                PRE_QC_RETURN = item.PRE_QC_RETURN.HasValue ? Convert.ToDateTime(item.PRE_QC_RETURN) : (DateTime?)null,
                FEEDBACK_APPROVED = item.FEEDBACK_APPROVED,
                QC_COMMENTS = item.QC_COMMENTS,
                FEEDBACK = item.FEEDBACK
            };

            _context.QC_LOG_FEEDBACK.Add(add);
            _context.SaveChanges();

0

[解決済み] Entity Framework Code First(私の場合)では、問題DateTimeDateTime?解決するために変更するだけです。

/*from*/ public DateTime SubmitDate { get; set; }
/*to  */ public DateTime? SubmitDate { get; set; }

0

エラー: datetime2データ型をdatetimeデータ型に変換すると、値が範囲外になりました。

このエラーは、NOT EFを使用してSQL DBにNOT NULL日付列に対して任意の値を代入し、同じを割り当てることで解決しました。

お役に立てれば!


0

Database Firstアプローチからクラスを作成したときにこの問題が発生しました。単純にConvert.DateTime(dateCausingProblem)を使用して解決実際には、渡す前に常に値を変換してみてください。これにより、予期しない値からユーザーを救います。


0

日付フィールドの入力形式を、yyyy / mm / ddである必要なエンティティ形式に一致させる必要があります


1
OPの質問を提供する他の回答があり、それらはしばらく前に投稿されました。回答投稿するときは、「良い回答を書くにはどうすればよいですか?」を参照してください。、特に古い質問に答える場合は、新しいソリューションまたは大幅に優れた説明を追加してください。
help-info.de
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.