使用插入的Oracle.ManagedDataAccess.EntityFramework事务获取插入记录的ID时出现问题

时间:2018-11-14 17:08:39

标签: c# oracle entity-framework entity-framework-6 oracle-manageddataaccess

在一个.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作为主键,其中triggersequence将为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,或者从序列中选择是不准确的并且是模糊的。

任何帮助将不胜感激。

1 个答案:

答案 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