2016-09-13 4 views
0

Fluent-API設定を使用してテーブルを設定するには、エンティティフレームワークを使用しています:DateTime.NowをDateTime2(Precision = 0)列にミリ秒を省略して保存する方法( "ゼロアウト")

Property(g => g.DateTime).IsRequired().HasColumnType("datetime2").HasPrecision(0); 

テーブルが実際に正常に作成されますん:

CREATE TABLE [dbo].[Foo] (
    [DateTime]  DATETIME2 (0) NOT NULL, 
); 

あなたが見ることができるようにDATETIME2列の精度は0に設定されています。したがって、検索された日時の値にはミリ秒が含まれないことが予想されます。日時は'13年3月13日18:35:37.0000 'のようになります。ただし、検索された日付には常にミリ秒が含まれます。ここで私が使用しているコードです:

​​

どのように私はゼロアウトミリ秒を手動で(C#のコードを経由して挿入前または取得後のいずれか)に頼ることなく所望の効果を達成することができますか?

+0

これで、EFがローカルオブジェクトの切り捨てを処理することを期待していますか? –

+3

あなたが与えたコードでは、実際にはデータベースから何かを取得することは明らかではありません。新しいコンテキストを起動してから実際にフェッチすると、まだミリ秒かかりますか?もしそうなら、価値は何ですか? –

+0

「[質問には「タイトルにタグを含める必要がありますか」](http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-the-titles)を参照してください。コンセンサス"いいえ、彼らはすべきではありません"です! –

答えて

1

私は驚いたことを私に告げた@JonSkeetに帽子を切った。私がインスタンス化した最初のdbcontextには、何らかのキャッシュが行われていて、提供された日付と時刻の値がミリ秒単位でそのまま返されていることがわかりました。

var dbcontext = new ApplicationDbContext(); //foo table is empty 
dbcontext.Foo.Add(new Entry { DateTime = DateTime.Now }); 
dbcontext.SaveChanges(); 

var dbcon2 = new ApplicationDbContext(); //vital 
var date = dbcon2.Foo.First().DateTime; 

:目的の動作を取得するためには、このことについてに行くための一つの方法は、キャッシュされた値は、日時のリターンもないことを保証するために、DB-コンテキストを再インスタンス化し、タブラ・ラサベースで開始することですあなたはこのコードを使用している場合、少なくとも最後にではなく、:。

var dbcontext = new ApplicationDbContext(); //foo table is empty 
var entry = new Entry { DateTime = DateTime.Now }; 
dbcontext.Foo.Add(); 
dbcontext.SaveChanges(); 
dbcontext.Entry(entry).Reload(); //doesnt suffer from the quirks of dbcontext.Gigs.First() 

PS:また、あなたはそれをインスタンス化する新しいDB-コンテキストを必要としないという利点を有する.ENTRY()リロード()を使用することができますユニットテストプロジェクトでは、プロジェクトを再構築してから、プロジェクトを再構築するようにしてください(少なくとも、私のプロジェクトで作業するためにはやったことはありません)

1

ミリ秒単位で日付と時刻が必要な場合は、代わりにsmalldatetime MS SQL型を使用してください。精度は1秒です。

何らかの理由でデータベースにdatetime2を追加する場合は、自動的に目的の動作を達成する方法はありません。データベース接続プロパティの正しい値を取得および設定する(計算された)MyDateTimeWithoutMsプロパティを作成できます。

internal DateTime databaseDateTime { get; set; } 
    public DateTime MyDateTimeWithoutMs 
    { 
     get 
     { 
      return databaseDateTime.DateTimeWithoutMs(); 
     } 
     set 
     { 
      databaseDateTime= value.ToDateTimeWithoutMs(); 
     } 
    } 

モデルマッピングでは、計算されたプロパティを無視し、データベースプロパティを実際の列名にマッピングします。

public class EntryMap : EntityTypeConfiguration<Entry > 
{ 
    public Entry Map() 
    { 
     Property(t => t.databaseDateTime) 
      .HasColumnName("DateTime"); 
     Ignore(t => t.MyDateTimeWithoutMs); 
+0

+1 Sergeyのチューニングに感謝します。私はあなたのアプローチがかなりエレガントであると感じます。私は交渉よりも多くの洞察力を持っています - 私はそれをあなたに与えます!私は 'smalldatetime'を認識していましたが、datetime2がサポートする日付範囲をサポートしていないので、datetime2に最初にショットを与えると考えました。再度、感謝します! – xDisruptor

関連する問題