博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Entity Framework操作Oracle数据库实现主键自增问题
阅读量:4512 次
发布时间:2019-06-08

本文共 1446 字,大约阅读时间需要 4 分钟。

转载:

最近在参与一个.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官方有篇针对这个问题的文章:

 

转载于:https://www.cnblogs.com/HouZhiHouJueBlogs/articles/3844171.html

你可能感兴趣的文章
POJ 3134 Power Calculus ★(记录状态的BFS)
查看>>
POJ 3678 Katu Puzzle(POJ 六道2-SAT之一)
查看>>
面向对象初识
查看>>
LeetCode: Find All Duplicates in an Array
查看>>
免费计算机编程类中文书籍
查看>>
mysql之TIMESTAMP(时间戳)用法详解
查看>>
JS笔记——Function类型(JS笔记系列)
查看>>
抽象类入门常见错误
查看>>
javascript修改html <b>标签里面的内容
查看>>
open live writer安装以及代码高亮、折叠插件安装
查看>>
消息队列
查看>>
POJ 1321 棋盘问题 dfs回溯
查看>>
org.apache.catalina.LifecycleException异常的处理
查看>>
C++转向C#的疑惑:难道C#中没有拷贝构造函数 ?[转]
查看>>
计算一个整数二进制中1的个数
查看>>
netdom join 错误:指定的域不存在,或无法联系。
查看>>
Android中Dialog的使用
查看>>
12/10/2015 校内测试:数列
查看>>
Android Activity接收Service发送的广播
查看>>
[Leetcode] Spiral Matrix | 把一个2D matrix用螺旋方式打印
查看>>