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);//这样既不会报错,数据量也正确,但是并不想批量添加,和模拟的场景不符合


哪位大侠碰到过这个问题?帮忙

参考技术A 我遇到过了, 这个问题非常苦逼啊.
我对比了一下 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 代码中映射复合主键?

如何处理 Entity Framework 中缺少主键的问题?

Entity Framework Core “实体类型‘XXX’需要定义一个主键。”