Oracle+Entity Framework主键冲突

最近用EF连接Oracle在添加数据时报主键冲突的错误,主键ID是自增长的,用触发器实现的,下面是代码using(DBConnStrentity=newDBConnStr... 最近用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);//这样既不会报错,数据量也正确,但是并不想批量添加,和模拟的场景不符合
}

哪位大侠碰到过这个问题?帮忙
展开
 我来答
匿名用户
推荐于2016-02-05
展开全部
我遇到过了, 这个问题非常苦逼啊.
我对比了一下 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;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式