2011-12-14 26 views
36

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

答えて

33

SQLでのTimeSpanを保存する方法についての私のprevious questionを1として最終的には、SQL Serverに相当するものが存在しないため、TimeSpan列をマップしませんでした。私は単にタイムスパンをダニに変換し、それをDBに格納した第2フィールドを作成しました。私はその後、TimeSpanの格納を防ぎました

public Int64 ValidityPeriodTicks { get; set; } 

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

このアプローチは、誰かがValidityPeriodがNotMappedプロパティであることを知らない、または忘れた場合に、最適でないクエリにつながる可能性があります。クエリEFが不平を言っていないLINQで使用されている場合は、コレクションをプルしてそれを反復処理します。このため、古いファッションのGet/Setアクセサを使用して、クエリで使用しないことを明確にすることができます。 – StanislawSwierc

+0

合意しました。私のソリューションでコードを調整して、実装がより明確になるようにしました。 – GraemeMiller

+4

拡張メソッドを使用して値を取得または設定し、誤解が少なくなるようにします。 – deerchao

1

まず、MVCはこの問題とは関係ありません。これはEF Code FirstとSQL Serverに完全に関連しているため、DALの問題です。

一つの解決策は、このように、あなたのエンティティの設定でカスタムの列の型を提供することができます:私は秒またはチケットとしてそれを保存するために助言された

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

それは、私が気にしているものであればどんなSQLタイプでもあります。 .Net TimeSpanをSQLサーバーフィールドにマップする標準的な方法は何ですか。 – GraemeMiller

+0

私は十分にはっきりしていると思った。 HasColumnTypeメソッドの文字列パラメータには、nvarchar(50)などのsqlスクリプトまたはテーブルデザイナで宣言するSQL型と、使用する.Netデータ型に互換性のある必要なものなどが含まれている必要があります。あなたの特定のケースで使用する正確なタイプは何ですか、単に実験してください。 –

+5

私は列の種類を変更する方法を知っていましたが、それは問題ではありません。それは合理的によくある問題マッピングのようです.Net TimeSpan to SQL。私はSQL Serverへの.Net TimeSpanの格納を処理する最良の方法について具体的に知りたいと思っていました。 – GraemeMiller

3

私の知る限り、同等のデータ型はSQL Server for .NETのTimeSpanにありません。最も近いものはTimeですが、あなたが指摘したように、それは最大24時間の値しかサポートしていませんか? http://msdn.microsoft.com/en-us/library/ms186724.aspx#DateandTimeDataTypes

次のMSDNドキュメントには、http://msdn.microsoft.com/en-us/library/bb386909.aspxが記載されています。私はそこにリストされた解決策がないので、現在可能ではないと仮定しています。

+1

ええ、私は決して私の答えから離れて見つけたことはありません。 EFは、明らかにそれが不一致であるSQL Server Timeデータ型にマップする奇妙な決定をするようです – GraemeMiller

関連する問題