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);//这样既不会报错,数据量也正确,但是并不想批量添加,和模拟的场景不符合
}
哪位大侠碰到过这个问题?帮忙 展开
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);//这样既不会报错,数据量也正确,但是并不想批量添加,和模拟的场景不符合
}
哪位大侠碰到过这个问题?帮忙 展开
1个回答
推荐于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 检测到 主键冲突了, 于是不让你插入了)
我当时只好找个表来存储序列号,处理起来,也是很麻烦。
我对比了一下 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;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询