簡體   English   中英

使用插入的Oracle.ManagedDataAccess.EntityFramework事務獲取插入記錄的ID時出現問題

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

在一個.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,或者從序列中選擇是不准確且模糊的。

任何幫助將不勝感激。

多虧了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM