mysql 触发器 生成主键_Mysql EF 触发器生成主键id 存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项 ;...

情景,在mysql的一张表里面的id字段是主键,但是这个主键的值,不是自增的,也不是用户传入的,而是当insert的时候,由触发器来生成的.

4e2672a4609369a341debe32f88df2f6.png

这是触发器代码

5b2ca02bf9265624a6f2cd4ad2fd8f5e.png

我们到edmx模型中看看 EF生成的 , 很诡异的是, 由于我们的 creationtime 的字段是 timestamp 并且有个默认值是 Current_timestamp ,我们的EF居然认为这个是主键自增,这里要修改成  none

bf68f9766c797c5d6c0debad282ce3a7.png664a2a7996bcb9f6488711557aa375a4.png

然后我们去看看  userid 是如何设置 默认就是 none

c6565fe3f6b108401e85a1f174fc838e.png

下面我们保存一条语句 试试

ed8f1e79cc73d9f89c04ed5c36d8486a.png

我们通过 Entity Framework Profiler监控可以看到,插入的 主键id 是0  ,然后我们去数据库看看, 触发器已经是正常工作, 主键的id 已经生成了

0047c0da33361b2bd676eeff7721fa7e.png

但是这个时候,我们在程序里面,  没有拿到新生成的主键id 啊, 而且刚才的 EF语句里面也没有帮我们查询出 新生成的主键id 呀… 这个怎么办?

29cf8600dd7bd82c65c2d4449707e3f7.png

这个时候,我尝试去修改 edmx 模型,  把 userid 的 StoreGeneratedPattern 设置为 Identity ,也就是表示这个键的id值是数据库自增的 ,我们来试试

f4f4386940327a86609646e723a48839.png

提示报错了

9549073e819a8ad9517437ae783d82f6.png

我们来看看EF给我们生成的mysql是如何的

2760b313994e63e75140fa54452ef2f0.png

我们把他生成的 sql 语句, 丢到 mysql 里面跑一下 , 居然在 mysql 里面 能成功添加一条数据到表里面

c754cd6472e7c6c03e38a045520e84f6.png

我们来仔细看看 sql语句  ,为了方便,我添加了一个  SELECT LAST_INSERT_ID();   用于查看到底 这个最近添加的id的值是多少,结果是默认值0

f2895b986dae08c6ae6ecf5d44c2a6c5.png

整个sql最后的查询结果 userid 是空的

05389a58aef58516314d91d425bc2e7e.png

由于我们是使用EF来保存,他最后返回的 userid 是要 保存到刚才我们的实体里面做主键的,但是主键能为 空值 么? 很显然是不可以,所以 EF 认为这个批量执行过程没成功,直接报错了  . 但是我们在 mysql里面的时候,由于只是执行sql语句, 不存在EF那样的主键判断,所以 mysql 中就能成功添加一条记录.

那在EF5中 怎么才能拿到这个 用触发器 来生成的主键id ?  其实这里有个坑,那就是  通过触发器生成的主键id ,你想通过 我们平时的 SELECT LAST_INSERT_ID(); 是根本拿不到的,如果是在 实际的开发过程中,尽量要避免用 触发器来生成id这个值.

但是好在我这里只是用来导入数据,所以我在我的 c# 代码里面,直接用 max函数 查询出刚才生成的 用户id就可以了

我们还是把 userid的  StoreGeneratedPattern 再次设置为 none    这个 None:表示不处理1d300a1910cdb37ecddc6c5776f22cb3.png

然后我们在c#代码里面 使用    Database.SqlQuery 方法,直接执行sql语句,返回刚刚增加到数据库生成的 userid 的值  (这里是随便用用可以这么做,实际做开发的时候,是不可以这么搞的,用 触发器来生成 主键 id  不怎么可行 )

5251c817beecaddf1f636d6c7226a367.png

下面是一个老外,也是掉到了这个坑里…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值