33

DBにいくつかの定数をシードしようとしています:

context.Stages.AddOrUpdate(s => s.Name,
                                   new Stage()
                                   {
                                       Name = "Seven",
                                       Span = new TimeSpan(2, 0, 0),
                                       StageId = 7
                                   });
context.Stages.AddOrUpdate(s => s.Name,
                                   new Stage()
                                   {
                                       Name = "Eight",
                                       Span = new TimeSpan(1, 0, 0, 0),
                                       StageId = 8
                                   });

これは、EF Codefirst Migrations の Seed() 関数内にあります。ステージ 8 で次のように失敗します。

System.Data.UpdateException: エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。---> System.OverflowException: SqlDbType.Time オーバーフロー。値 '1.00:00:00' は範囲外です。00:00:00.0000000 から 23:59:59.9999999 の間である必要があります。

EF を使用してタイムスパンを保存できないのはなぜですか? ここで、両端でばかげた時間からティックへの変換を行う必要がないことを本当に願っています...

4

5 に答える 5

48
    [Browsable(false)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    [Obsolete("Property '" + nameof(Duration) + "' should be used instead.")]        
    public long DurationTicks { get; set; }

    [NotMapped]
    public TimeSpan Duration
    {
#pragma warning disable 618
      get { return new TimeSpan(DurationTicks); }
      set { DurationTicks = value.Ticks; }
#pragma warning restore 618
    }

アップデート

これは、EF Core 2.1 以降、Value Conversionを使用して達成できるようになりました。

builder.Entity<Stage>()
    .Property(s => s.Span)
    .HasConversion(new TimeSpanToTicksConverter()); // or TimeSpanToStringConverter
于 2015-01-20T04:04:56.063 に答える
9

この行で:

Span = new TimeSpan(1, 0, 0, 0)

このコンストラクタを使用しています:

public TimeSpan(int days, int hours, int minutes, int seconds);

したがって、実際にはパラメーターにTimeSpan渡してから 24 時間以上を作成していますが、基になるデータベース タイプは00:00 ~ 23:59 の間の値のみを受け入れます。1daysTime

あなたが実際にTimeSpan1 日を過ごすつもりだったのか、それともただのタイプミスなのかを判断するのは困難です。

本当にTimeSpan24 時間以上が必要な場合は、フィールドを別のデータベース タイプ ( などSmallDateTime) にマップする必要があると思います。

単なるタイプミスの場合は、行を次のように変更してください。

Span = new TimeSpan(1, 0, 0),
于 2013-06-16T07:51:20.197 に答える
0

前述のように、問題は EF が TimeSpan クラスを Time にマップすることであり、これは 24 時間に制限されています。

24 時間を超えるタイムスパンを保存する必要がある場合は、次の 2 つの方法のいずれかをお勧めします。

1)タイムスパンのさまざまな要素の int プロパティを持つ TimeSpan エンティティを作成します。次のようになります。

 public class Timespan
{
    public Int64 Id { get; set; }

    public Int16 Years { get; set; }

    public int Months { get; set; }

    public Int64 Days { get; set; }

    public Int64 Hours { get; set; }

    public Int64 Minutes { get; set; }
}

該当するエンティティの外部参照をカスタム Timespan エンティティに追加するだけです。

2)このブログ投稿で説明されているように、時間からティックへのばかげた変換を行います。

于 2014-01-07T10:57:36.653 に答える