http://stackoverflow.com/questions/24725261/how-to-use-a-custom-identity-column-in-sql-with-entity-framework

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

这是触发器代码

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

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

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

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

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

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

 

提示报错了

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

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

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

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

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

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

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

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

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


 

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

http://blog.devart.com/set-identity-and-computed-properties-in-entity-framework-without-triggers.html

Mysql EF 触发器生成主键id 存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项 ;System.Data.Entity.Infrastructure.DbUpdateConcurrencyException的更多相关文章

  1. 存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项。

    在用asp.net MVC3 的MusicStore时候 Edit某个数据项时提示下面的错误: 存储区更新.插入或删除语句影响到了意外的行数(0).实体在加载后可能被修改或删除.刷新 ObjectSt ...

  2. [Asp.net mvc]实体更新异常:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。

    学习asp.net mvc 时在更新实体进行SaveChanges()的时候出现了异常,异常如下: “/”应用程序中的服务器错误. 存储区更新.插入或删除语句影响到了意外的行数(0).实体在加载后可能 ...

  3. EF 更新数据出现 System.Data.Entity.Infrastructure.DbUpdateConcurrencyException: 异常

    EF6更新 数据出现 System.Data.Entity.Infrastructure.DbUpdateConcurrencyException: Store update, insert, or  ...

  4. system.Data.Entity.Infrastructure.DbUpdateConcurrencyException: Store update, insert, or delete statement affected an unexpected number of rows (0) 问题

    页面控件没有做限制.提交后还可以继续点击,造成了在短时间内的多次请求.查看日志两次错误在200ms之内. 错误信息 system.Data.Entity.Infrastructure.DbUpdate ...

  5. ef添加数据时出错 System.Data.Entity.Infrastructure.DbUpdateConcurrencyException”类型的异常

    找半天才找到 ef添加数据时出错原因:数据库表中没有主键 ,就算表中有自增列 Added方法也会报错: -        this._db.SaveChanges() “this._db.SaveCh ...

  6. System.Data.Entity.Infrastructure.DbUpdateException

    异常描述:   捕捉到 System.Data.Entity.Infrastructure.DbUpdateException  HResult=-2146233087  Message=无法更新 E ...

  7. (转)MyBatis+MySQL 返回插入的主键ID

    MyBatis+MySQL 返回插入的主键ID 需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如 ...

  8. Mycat探索之旅(4)----Mycat的自增长主键和返回生成主键ID的实现

    说明:MyCAT自增长主键和返回生成主键ID的实现 1) mysql本身对非自增长主键,使用last_insert_id()是不会返回结果的,只会返回0:这里做一个简单的测试 创建测试表 ------ ...

  9. code first System.Data.Entity.Infrastructure.CommitFailedException: An error was reported while committing a database transaction but it could not be determined whether the transaction succeeded

    System.Data.Entity.Infrastructure.CommitFailedException: An error was reported while committing a da ...

随机推荐

  1. BZOJ.2879.[NOI2012]美食节(费用流SPFA)

    题目链接 /* 同"修车":对于每个厨师拆成p个点表示p个时间点,每个人向m个厨师每个时间点连边 这样边数O(nmp)+网络流 ≈O(nm*p^2)(假设SPFA线性) = GG ...

  2. [JSOI2004]平衡点/[BZOJ3680]吊打XXX

    [JSOI2004]平衡点/[BZOJ3680]吊打XXX 题目大意: 有\(n(n\le10000)\)个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.假设绳子 ...

  3. 提交JSON修改数据

    提交JSON修改数据 设计目标: 1)可以一次性提交多个表的修改数据 2)跨语言.跨平台 { "deltas": [ { "table": "tuni ...

  4. Linux下tomcat修改成的80端口无法访问

    转自: https://blog.csdn.net/u013252047/article/details/72834415 tomcat放到服务器上访问8080端口还需要输入端口号,造成访问不便,好多 ...

  5. CentOS安装mysql*.rpm提示conflicts with file from package的解决办法

    看到“conflicts”,是产生冲突了,文件“/usr/share/mysql/charsets/*”需要MySQL-server-5.6.19-1.linux_glibc2.5.x86_64版本的 ...

  6. Java Web开发总结(一)

    1.如何解决 tomcat 中文乱码问题? 2.如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet. <!-- 将Serv ...

  7. WIN10平板 传递优化文件能否删除

    在给系统准备做Ghost备份之前,一般会运行一次磁盘清理,但是WIN10系统多了一个传递优化文件(现在看到的体积很小,但其实可能是4-5G) 这个文件只是WIN10改进了系统更新策略产生的,就像是BT ...

  8. hadoop权威指南学习(一) - 天气预报MapReduce程序的开发和部署

    看过Tom White写的Hadoop权威指南(大象书)的朋友一定得从第一个天气预报的Map Reduce程序所吸引, 殊不知,Tom White大牛虽然在书中写了程序和讲解了原理,但是他以为你们都会 ...

  9. MDX 查询原型

    本篇文章记录 SBS 中 MDX 查询原型,可以根据这些查询原型来解决实际项目中的问题. 1. 查询在 2004年1月2日 - 2004年3月1日之间购买过 Bikes 产品的用户. SELECT ( ...

  10. sublime 3插件推荐

    新建文件以及快速注释 1.   SublimeTmpl 快速生成文件模板 一直都很奇怪为什么sublime text 3没有新建文件模板的功能,像html头部的DTD声明每次都要复制粘贴.用Subli ...