2017-09-24 8 views
3

のためのSQLの精度を生成する方法を変更するにはどうすればこのようにEntity Frameworkのことでデータを更新しようとすると:私は取得Entity Frameworkのは、私はテーブルの使用ID & DateTime列がPKもありますが、日時

using (Entities context = new Entities()) 
{ 
    var item = (from item in context.BatchData 
       where item.Id == 2 
       select item).FirstOrDefault(); 

    item.Title = "EF6TEST"; 

    context.SaveChanges(); 
} 

をエラー

ストアの更新、挿入、または削除ステートメントが予期しない行数(0)に影響を与えました。

私はSQLを記録した後、私は今の理由を知っています。 SQLだからこの

'update [dbo].[BatchData] 
set [BatchData_Title] = @0 
where (([BatchData_Id] = @1) and ([BatchData_CreatedDateTime] = @2)) 

select [BatchData_Rowversion] 
from [dbo].[BatchData]BatchUploadData 
where @@ROWCOUNT > 0 and [BatchData_Id] = @1 and [BatchData_CreatedDateTime]  = @2', 
N'@0 varchar(30),@1 tinyint,@2 datetime2(7)', 
@0='EF6TEST',@1=1,@2='2017-09-16 11:29:35.3720000' 

のように見えます

、その理由は、SQLでBatchData_CreatedDateTimeパラメータは精度が7であり、それは@2='2017-09-16 11:29:35.372'する必要があり、@2='2017-09-16 11:29:35.3720000'です。

ここに私の質問です、それを修正するには?

+0

あなたのSQLサーバはどのデータ型を使用していますか? DateTimeまたはDateTime2? – Alander

+0

DateTimeを使用するSQLサーバー –

+0

SQL ServerでのDateTimeの精度はミリ秒(.fff)です。したがって、SQLサーバー側の.372は正しいです ただし、.NET DateTimeは7の精度を返します。データ型をDateTime2に更新できますか? – Alander

答えて

6

あなたはDateTime2からDateTimeへのパラメータの種類を変更インターセプターの一例であり、あなたがあなたのDB /たDbCommandのパラメータの特定のフィールドにそれを使用するためにそれを拡張することができ、ここで、必要なデータを変更するIDbInterceptorを使用することができます。 SQLは、0 = 0、@、2 DATETIME2(7)」@

から変更されます生成されたあなたのdbContextクラスのOnModelCreating

の終わりにDbInterception.Add(new DateInterceptor());を追加し、それを使用するには

​​

、 @ 1 = 1、R2 = '2017年9月24日14:41:33.7950485'

に40::

2日時」、@ 0 = 0、@ 1 = 1、@ 2 = '2017年9月24日14 @ 32.327'

+0

ありがとう、DateInterceptorを試しました。 それは働いた –

関連する問題