【发布时间】:2018-11-14 17:08:39
【问题描述】:
在一个.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,或者从序列中选择不准确,模糊。
任何帮助将不胜感激。
【问题讨论】:
-
你需要配置你的EF模型告诉它数据库正在生成那个值,然后它会在插入后查询它。
标签: c# oracle entity-framework entity-framework-6 oracle-manageddataaccess