[英]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
作為主鍵,並帶有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()
之后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.