我在服务器端使用运行时为 19.3.0.0的 Oracle 数据库。 我有一个.NetFW 4.6.1客户端需要使用oracle.ManagedDataAccess包连接到这个数据库 当我查看包管理器时,我得到了多个选项,用于 19c 的oracle.ManagedDataAccess包,范围从1 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
在一个.Net framework
项目中,我使用Visual Studio添加了一个EF 6.x DbContext Generator
,该文件添加了一个.edmx
文件以及一些.tt
文件。 它实现了我的database first
结构。
然后,我连接到oracle
数据库,并使用如下模型将表添加到其中:
// DatabaseContext.tt > USER_TYPE.cs
public class USER_TYPE
{
public int ID { get; set; } // have sequence and insert trigger.
public string NAME { get; set; }
}
// DatabaseContext.tt > USER.cs
public class USER
{
public int ID { get; set; } // have sequence and insert trigger.
public int USER_TYPE_ID { get; set; } // foreign key to USER_TYPES.ID
public string NAME { get; set; }
}
还安装了Oracle.ManagedDataAccess.EntityFramework
Nuget软件包。
两个表都将ID
作为主键,并带有trigger
和sequence
,这将为ID
列提供唯一值。
现在,我要开始一个事务,以便在相互关联的表中插入一些记录:
using (var db = new DatabaseContext())
using (var transaction = db.Database.BeginTransaction())
{
// insert userType
var userType = new USER_TYPE
{
NAME = "admin"
};
db.USER_TYPES.Add(userType);
db.SaveChanges();
// userType.ID == 0 : true
// insert user
var user = new USER
{
NAME = "admin user",
USER_TYPE_ID = userType.ID
};
db.USERS.Add(user);
db.SaveChanges();
transaction.Commit();
}
问题出在db.USER_TYPES.Add(userType); db.SaveChanges()
之后db.USER_TYPES.Add(userType); db.SaveChanges()
db.USER_TYPES.Add(userType); db.SaveChanges()
我们知道userType.ID
将保持为0
(因为我们使用的是oracle)。
Web中有一些解决方案建议通过执行select max ID查询来获取最新插入的ID,或者在插入之前获取下一个序列值。 但是,当我们使用Transaction时 ,db中没有实际记录来选择max,或者从序列中选择是不准确且模糊的。
任何帮助将不胜感激。
多亏了David Browne在第一篇文章中的评论并使用了此 Nuget包,我才将StoredGeneratedPattern更改为.edmx
文件中主键列的 Identity
。
通过此更改,实体框架将不会将插入sql脚本中的ID传递给数据库:
insert into MY_TABLE (NAME) VALUES (@some_value) -- ID is not passed.
而且在插入之后,即使我使用transactions
,也会自动从数据库中获取ID(我的主键列)。
using (var db = new DatabaseContext())
using (var transaction = db.Database.BeginTransaction())
{
var userType = new USER_TYPE
{
NAME = "admin"
};
db.USER_TYPES.Add(userType);
db.SaveChanges();
Debug.Assert.IsTrue(userType.ID != 0); // ✔️ will be passed.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.