gpt4 book ai didi

c# - 如何更改 Entity Framework 为 Datetime 生成 SQL 精度的方式

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:17 26 4
gpt4 key购买 nike

我有一个表使用 id 和 DateTime 列作为 pk,但是当我尝试像这样通过 Entity Framework 更新数据时:

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

item.Title = "EF6TEST";

context.SaveChanges();
}

我得到一个错误

Store update, insert, or delete statement affected an unexpected number of rows (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参数是@2='2017-09-16 11:29:35.3720000',精度是7,它应该是 @2='2017-09-16 11:29:35.372'

这是我的问题,如何解决?

最佳答案

您可以使用 IDbInterceptor 来更改所需的数据,这里是一个将参数类型从 DateTime2 更改为 DateTime 的拦截器示例,您可以扩展它以在您的 DB/DbCommand 参数的特定字段上使用它。

public class DateInterceptor : IDbInterceptor, IDbCommandInterceptor
{
public void ReaderExecuting(DbCommand command,
DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
var dateParameters = command.Parameters.OfType<DbParameter>()
.Where(p => p.DbType == DbType.DateTime2);
foreach (var parameter in dateParameters)
{
parameter.DbType = DbType.DateTime;
}
}

要使用它,请将 DbInterception.Add(new DateInterceptor()); 添加到 dbContext 类的 OnModelCreating 的末尾

生成的 SQL 将从

@2 datetime2(7)',@0=0,@1=1,@2='2017-09-24 14:41:33.7950485'

@2 datetime',@0=0,@1=1,@2='2017-09-24 14:40:32.327'

关于c# - 如何更改 Entity Framework 为 Datetime 生成 SQL 精度的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47716284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com