100分,ef6中,能否向自增列插入数据?

LinuxCard 2015-10-15 09:45:16
应用场景是这样的

log表(log_id(主键),operator_id,msg)

operator表(operator_id(自增主键),operator_name)


当用户没有登录的时候,log表也会记录日志,这个时候opertor_id一列就是空的,当我要展现log表内容的时候,就需要使用leftjoin来展现,而leftjoin在ef中写起来挺麻烦的。

我的想法是系统初始化的时候,向operator表中插入一条固定的记录(operator_id=-1,operator_name="未登录"),那么当取不到operator_id的时候,就插入-1,这样展现的时候,就很方便了

但是我发现ef在插入的时候,是不能插入自增列的值的,那么看上去有点行不通了,还有别的方法能实现吗?
...全文
422 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
winner2050 2015-10-17
  • 打赏
  • 举报
回复
你的编程思想还停留在sql语句的编写范畴。
tcmakebest 2015-10-16
  • 打赏
  • 举报
回复
自增不能插入是常规条件, 是有办法的,下面是测试代码:
CREATE TABLE [dbo].[test](
	[name] [nvarchar](100) NULL,
	[id] [int] IDENTITY(1,1) NOT NULL
)
SET IDENTITY_INSERT [dbo].TEST ON
insert into test(name,id) values('name',-1) 
SET IDENTITY_INSERT [dbo].TEST OFF
  • 打赏
  • 举报
回复
“向operator表中插入一条固定的记录(operator_id=-1,operator_name="未登录")” 首先你自增列、主键,根本做不到插入一个固定的值。 要么不这么设计,要么这列不能做为主键。其实按你的思路,你不如主键是无意义的自增主键id,而operator_id不作为主键,默认为空(即你前面的固定值),然后建立个operator_id的唯一索引。
LinuxCard 2015-10-15
  • 打赏
  • 举报
回复
引用 4 楼 hanjun0612 的回复:
手动插入一条用户数据,叫做 visitUser 判断用户session是否为空,为空就给他这个visitUser用户。
插入的这条visituser用户,我不知道他的operatorid,难道每次都要从数据库里查询一遍吗?
风吹腚腚凉 2015-10-15
  • 打赏
  • 举报
回复
首先你逻辑混乱,根本不懂设计,你这里设计就有问题。 登陆记录登陆日志, 登陆名,谁几点,几分登陆,结果是成功还是失败, 不成功,则不向operator插入数据, 并且把log表中的operator_id设置为-1, 成功设置为 operator_id关联ID。 不需要再插入一条-1的数据。 如果真需要这样类似的逻辑,你需要设置一个状态, 当状态为-1的时候表示是登陆失败的记录。 这个要看你的结构怎么设计了。 这些方案都能解决你那混乱的设计。
正怒月神 版主 2015-10-15
  • 打赏
  • 举报
回复
手动插入一条用户数据,叫做 visitUser 判断用户session是否为空,为空就给他这个visitUser用户。
ajianchina 2015-10-15
  • 打赏
  • 举报
回复
楼主的想法我觉得还有点意思,办法自然有,初始化你干脆直接用代码来建表,然后插入一条默认数据,自增种子如果是从-1开始,那么第一条数据id自然就是-1,但你这张表总归也会让人可以删除指定数据的吧?数据把这条数据删了,从逻辑上讲log表的所有关联数据都应该删掉,并且以后的未登录用户的数据你怎么办?难不成你还要单独写上代码-1的id禁止删除吗? 不想在查询的时候进行连接查询,那你可以对数据表进行关联,后面写起来就方便了。 http://blog.csdn.net/niewq/article/details/17232321
LinuxCard 2015-10-15
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
自增不可能让你插入主键的,否则你就不应该用自增,left join在linq里面也就是多个i.DefaultIfEmpty(),没啥复杂的吧,当然ef支持表创建时进行数据初始化,但这貌似要code first才行,看你发的是asp.net版块,要不你就在global里面自己判断是否要新增一条记录,然后将自增的第一条记录作为你的log默认的operator_id
是用的codefirst,但是在创建表的时候,也是一样无法插入自增列的
  • 打赏
  • 举报
回复
自增不可能让你插入主键的,否则你就不应该用自增,left join在linq里面也就是多个i.DefaultIfEmpty(),没啥复杂的吧,当然ef支持表创建时进行数据初始化,但这貌似要code first才行,看你发的是asp.net版块,要不你就在global里面自己判断是否要新增一条记录,然后将自增的第一条记录作为你的log默认的operator_id
正怒月神 版主 2015-10-15
  • 打赏
  • 举报
回复
引用 6 楼 LinuxCard 的回复:
[quote=引用 4 楼 hanjun0612 的回复:] 手动插入一条用户数据,叫做 visitUser 判断用户session是否为空,为空就给他这个visitUser用户。
插入的这条visituser用户,我不知道他的operatorid,难道每次都要从数据库里查询一遍吗?[/quote] 插入后,你可以将这个operatorid写到config中或者服务器缓存中。反正也只是需要一个有效的operatorid用来关联你的Log是吧

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧