繁体   English   中英

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

Problem in getting inserted record`s ID Using transaction with Oracle.ManagedDataAccess.EntityFramework

提示:本站收集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作为主键,并带有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()之后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,或者从序列中选择是不准确且模糊的。

任何帮助将不胜感激。

1 个回复

多亏了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.
}
3 使用Form_tag插入记录时出现问题

我有一个新问题。我想向数据库插入一条记录。 没有错误发生,但记录未成功保存。我的模型名称是副词,一个字段的名称是name。这是我的代码: 在我的路线上 和控制器: 谢谢你的帮助 ...

4 插入记录时出现问题。 冬眠

对不起,英语不好,我很难理解。 我有几个实体:目录和域。 关键字段(Id)中的引用不能超过自动生成的引用,即我应该自己编写。 这是代码实体。 我使用了自动映射fluentNHibernate。 该重叠部分用于手册。 同时在数据库中维护实体实例 收到错误 ...

8 将数据从.CSV插入Oracle时出现问题

我是PL / SQL Oracle的新手,正在尝试将.CSV数据插入数据库。 我收到消息,指出已插入数据,但是在检查数据库后,我注意到没有将数据插入数据库。 到目前为止,我尝试在insert语句中手动插入数据,但是它可以正常工作,但是在更改为从.CVS插入真实数据后,此方法不起作用。 ...

10 在事务中插入后获取id(Oracle)

假设我有三张牌桌:球队,球员,球队球员。 表team_player是一个允许“多对多”关系的桥表。 当有人想要创建新团队时,他们会指定该团队的初始玩家。 如何在同一事务中插入team和team_player行? 也就是说,我想在提交新团队行之前插入所有team_player记录。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM