加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在主键中使用DateTime创建实体

发布时间:2020-12-15 22:19:19 所属栏目:百科 来源:网络整理
导读:假设我们在SQL服务器中有以下表的“EfTest”数据库: create table Test( Id INT NOT NULL IDENTITY(1,1),TS DATETIME NOT NULL PRIMARY KEY (TS,Id)) 我们想在那里添加EF(在我的情况下为EF 5).我们在示例项目中从数据库创建edmx文件并编写以下代码: static
假设我们在SQL服务器中有以下表的“EfTest”数据库:

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问题而浪费数据库空间.我仔细检查了,似乎DATETIMEDATETIME2都占用了8个字节,所以我想我就是这样.

我可以在文本编辑器中编辑.edmx文件并让它认为主键只是Id列(因此EF在插入后不会使用TS来查找Id),但是VS将在下次从DB更新实体时覆盖我的编辑.

还有其他选择吗?

解决方法

我最终使用DATETIME2作为列类型,因为没有空间权衡:DATETIME和DATETIME2都占用8个字节.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读