Entity Framework操作Oracle数据库实现主键自增问题

转载:http://www.xinglongjian.com/index.php/2012/09/12/eforaclepkautoadd/

最近在参与一个.NET平台的项目,数据库采用ORACLE10g,中间的ORM框架采用微软官方的EF框架。在以model-first创建模型时并由模型生成数据库一切顺利,但是在添加数据时报出ORA-00001: unique constraint () violated 错误。该错误原因是在EDM模型构建时对于主键的生成在ORACLE数据库没有生效的原因。EDM中ID类型为INT32,默认值为0,每次插入数据时,ID值都为0,因此破坏了唯一性约束所致。下面通过一个简单的例子解决EF中通过model-first操作ORACLE数据库,完成添加数据的过程。

一,项目介绍

Visual Studio 2010
ORACLE10g
Entity Framework4.4
.NET Framework4

需要安装ODP.NET,可以参考这里

二,新建WinForm工程 名称为EFOracleWinForm

以添加用户为例,用户名和密码

三、添加EDM模型

   1、添加模型

右键 EFOracleWinForm--添加--新建项--ADO.NET实体数据模型

点击 “添加”,选择空模型

点击 完成。

在界面上 右键--添加--实体

确定,在添加用户名和密码两个标量属性

主键ID的属性,StoreGeneratedPattern=Identity, 可以为null为false,类型为Int32

 2、配置模型

在选择该模型配置其属性为

注意几点:

DDL生成模板选择SSDLToOracle.tt
      数据库架构名称为当前数据库的用户名
      数据库生成工作流选择Generate Oracle Via T4(TPT).xaml,每个类型一张表

3、根据模型生成数据库

模型界面点右键--根据模型生成数据库 弹出对话框,选择之前建立的数据库连接 MYTEST.172

并选中“是,在连接字符串中包含敏感数据”

下一步

点击完成生成 sql语句并创建表结构。(由于我的机器装有sql server,不能直接创建,只能用生成的sql创建的表)

4,带问题测试

此时项目已基本完成,启动winform工程测试,添加第一个用户成功,添加第二个用户报错:

这个错误就是开始时提到的错误。

5、解决问题。

既然该问题是由于在插入主键时插入了相同的值导致,那么就需要实现主键自动增加的功能,当插入数据库将该自动增加的值作为主键插入就可以了。

Oracle数据库中的"序列"能实现自动增加的功能,可以参考这里

设置好序列后,再为该表创建一个触发器,使在插入数据之前获取该自动增加的值并赋值给表的主键。

第一步,创建序列

在服务器资源管理器中,找到MYTEST.172连接,右键“序列”--新建序列

或者 在SQLPLUS中完成。

保存生成。

第二步,添加触发器

展开user表,可以看到“触发器”节点。右键--新建触发器

触发器名称为INSERTUSERID
发生选择 BEFORE
频率选择 ROW LEVEL

点击确定,打开该触发器编辑框,可以进一步编辑,最后结果为:

6、再次测试

成功了。

四、总结:

这种方式需要对每张表创建序列和触发器,对于数据表多的情况比较繁琐。由于水平有限,没有想到更好的解决办法,还希望高手们多交流指教。

oracle官方有篇针对这个问题的文章:http://www.oracle.com/technetwork/issue-archive/2011/11-sep/o51odt-453447.html

 

posted @ 2014-07-15 10:17  灬后知后觉  阅读(2104)  评论(0编辑  收藏  举报