Oracle+Entity Framework主键冲突
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle+Entity Framework主键冲突相关的知识,希望对你有一定的参考价值。
最近用EF连接Oracle在添加数据时报主键冲突的错误,主键ID是自增长的,用触发器实现的,下面是代码
using (DBConnStr entity = new DBConnStr())
for (int i = 0; i < 10; i++)
EMPLOYEE emp = new EMPLOYEE
CARDID = "320" + i.ToString().PadLeft(5, '0'),
NAME = "李四" + i.ToString(),
SEX = i % 2,
AGE = rnd.Next(20, 25)
;
entity.EMPLOYEE.AddObject(emp);
entity.SaveChanges();
//entity.SaveChanges(System.Data.Objects.SaveOptions.DetectChangesBeforeSave);//这样虽然不报错但是会重复保存前面的数据,本来10条,会变成55条
//entity.SaveChanges(System.Data.Objects.SaveOptions.DetectChangesBeforeSave);//这样既不会报错,数据量也正确,但是并不想批量添加,和模拟的场景不符合
哪位大侠碰到过这个问题?帮忙
我对比了一下 SQL Server 与 Oracle
如果是 SQL Server 的 identity 自增列
插入数据 SaveChanges 以后, 那个自增列的字段, 会自动更新的。
但是如果是 Oracle 的 触发器 + Sequence 的自增
插入数据 SaveChanges 以后, 那个自增列的字段,还是 0
也就是当插入1行数据的时候。SaveChanges 了。
SQL Server 里面, 那个 类的 id 会更新
Oralce 里面, 那个 类的 id 还是0
导致你再插入1行数据的时候。
SQL Server 啥问题没有
而 Oracle 就会抱 主键冲突 (其实这里都还没有插入数据库, 是 Entity Framework 检测到 主键冲突了, 于是不让你插入了)
我当时只好找个表来存储序列号,处理起来,也是很麻烦。追问
就是这个情况,讲的太好了,能私信一下吗?
追答这个问题, 我也没有解决啊, 只是通过下面这种方式, 暂时处理一下.
下面这种写法, 是有并发性问题的.
///
/// 获取 表的 序列号.
///
///
///
///
public static decimal GetNextSequence(TestEntities context, string tableName)
TEST_SEQUENCE sequence =
context.TEST_SEQUENCE.FirstOrDefault(p => p.TEST_TABLENAME == tableName);
if (sequence == null)
logger.ErrorFormat("尝试获取 0 表的序列号, 但是未能检索到数据!", tableName);
throw new ArgumentException(tableName + "的序列号信息不存在!");
// 获取当前序列号.
decimal result = sequence.TEST_NUMBER;
// 递增.
sequence.TEST_NUMBER = result + 1;
// 返回结果.
return result;
以上是关于Oracle+Entity Framework主键冲突的主要内容,如果未能解决你的问题,请参考以下文章
使用 Entity Framework Core 自动增加部分主键
Entity Framework Core 需要定义一个主键
如何使用 Entity Framework Core 获取主键值
如何首先在 Entity Framework 4 代码中映射复合主键?