create table Test ( Id INT NOT NULL IDENTITY(1,1),TS DATETIME NOT NULL PRIMARY KEY (TS,Id) )
我们想在那里添加EF(在我的情况下为EF 5).我们在示例项目中从数据库创建edmx文件并编写以下代码:
static void Main(string[] args) { var ctx = new EFTestEntities(); var t = new test(); t.TS = DateTime.Now; ctx.Tests.Add(t); ctx.SaveChanges(); }
我们运行它,它在ctx.SaveChanges()行上出现dbupdateConcurrencyException失败,说:
Store update,insert,or delete statement affected an unexpected
number of rows (0). Entities may have been modified or deleted since
entities were loaded. Refresh ObjectStateManager entries.
显然,那里没有发生并发. sql Server探查器报告以下查询由EF运行:
exec sp_executesql N'insert [dbo].[Test]([TS]) values (@0) select [Id] from [dbo].[Test] where @@ROWCOUNT > 0 and [Id] = scope_identity() and [TS] = @0',N'@0 datetime2(7)',@0='2015-08-27 18:29:45.1025442'
问题在于:@ 0 datetime2(7),@ 0 =’2015-08-27 18:29:45.1025442′. DATETIME2的精度高于DATETIME,WHERE子句中的TS检查阻止它查找刚刚插入的行.
问题:抛开我将DATETIME列作为PK的一部分的原因,如何使EF插入行而不抛出异常?
我可以使TS列为DATETIME2类型,这将解决问题,但我不想因为一些EF问题而浪费数据库空间.我仔细检查了,似乎DATETIME
和DATETIME2
都占用了8个字节,所以我想我就是这样.
我可以在文本编辑器中编辑.edmx文件并让它认为主键只是Id列(因此EF在插入后不会使用TS来查找Id),但是VS将在下次从DB更新实体时覆盖我的编辑.
还有其他选择吗?
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。