web-dev-qa-db-ja.com

24時間を超えるTimeSpanをSQLサーバーのコードファーストにマッピングするにはどうすればよいですか?

TimeSpan CodeFirstプロパティをSQLサーバーにマップしようとしています。 Code Firstは、SQLでTime(7)として作成しているようです。ただし、.NetのTimeSpanは24時間より長い期間を処理できるため、イベントの長さとして24時間より長く保存する必要があります。コードファーストでこれを処理するための最良の方法は何ですか。

40
GraemeMiller

私の 前の質問 TimeSpanをSQLに保存する方法については、秒やチケットなどとして保存するようにアドバイスされました。SQLサーバーに同等のものがないため、最終的にTimeSpan列をマップしませんでした。 。 TimeSpanをティックに変換する2番目のフィールドを作成し、それをDBに保存しました。その後、TimeSpanの保存を阻止しました

public Int64 ValidityPeriodTicks { get; set; }

[NotMapped]
public TimeSpan ValidityPeriod
{
    get { return TimeSpan.FromTicks(ValidityPeriodTicks); }
    set { ValidityPeriodTicks = value.Ticks; }
}

EF Coreでこれを実行したい場合は、 Value Conversions を使用できるため、はるかにクリーンです。 2.1では、値の変換とTimeSpanToTicksConverterを使用して、データベース内のティックにタイムスパンを透過的にマップできます。したがって、EF Coreを検討する価値は確かにあります(他の機能がニーズを満たしていると仮定します)-Framework 4.7プロジェクトで使用できるため、.NetCoreに切り替える必要はありません。

35
GraemeMiller

私の知る限り、SQL Server for.NETのTimeSpanには同等のデータ型はありません。最も近い一致は時間ですが、ご指摘のとおり、24時間までの値しかサポートしていませんか? http://msdn.Microsoft.com/en-us/library/ms186724.aspx#DateandTimeDataTypes

次のMSDNドキュメントでは、これについて説明しています http://msdn.Microsoft.com/en-us/library/bb386909.aspx 。そこに解決策がリストされていないので、現在は不可能だと思います。

3
Jon Miller

まず第一に、MVCはこの問題とは何の関係もありません。これは完全にEFCodeFirstとSQLServerに関連しているため、DALの問題です。

1つの解決策は、次のように、エンティティ構成でカスタム列タイプを提供することです。

modelBuilder
.Entity<MyClass>()
.Property(c => c.MyTimeSpan)
.HasColumnType("whatever sql type you want to use");
1
Matteo Mosca