在一个.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()
之后,我们知道userType.ID
将仍然为0
(因为我们使用的是oracle)。
网络上有一些解决方案建议通过执行select max ID查询来获取最新插入的ID,或者在插入之前获取下一个序列值。但是当我们使用 Transaction 时,db中没有实际的记录来选择max,或者从序列中选择是不准确的并且是模糊的。
任何帮助将不胜感激。
答案 0 :(得分:0)
感谢第一篇文章中的David Browne评论,并使用this Nuget软件包,我只是将 StoredGeneratedPattern 更改为我的我的Identity
文件中的主键列。
通过此更改,实体框架将不会将插入sql脚本中的ID传递给数据库:
.edmx
在插入后,即使我使用insert into MY_TABLE (NAME) VALUES (@some_value) -- ID is not passed.
,也会自动从数据库中获取ID(我的主键列)。
transactions