當我在 DBSet 中插入一個新專案時:
var newItemAdded = MyDBSet.Add(itemToAdd);
然后我將更改保存在資料庫中,例如:
MyContext.SaveChanges();
我的變數newItemAdded已使用資料庫生成的新 Id 自動更新。
我去EF Core Github查看邏輯,但是由于存盤庫中的檔案數量很大,我不確定理解背后的邏輯。
我更關心的是如何在插入后執行SaveChanges更新newItemAdded。EF 似乎不使用ref。
也許有人已經知道它是如何作業的?
謝謝
uj5u.com熱心網友回復:
這有效,沒有ref:
class Person{
int Id {get;set;} = -1;
string Name {get;set;}
}
...
void SaveChanges(Person per){ //no ref here
//simulate saving to DB
per.Id = new Random().Next();
}
...
var p = new Person{ Name = "John"; }
Console.WriteLine(p.Id); //prints -1;
SaveChanges(p);
Console.WriteLine(p.Id); //prints some random number
我們從不需要ref確保在 SaveChanges 中設定的人的 Id 幸存下來并且p在 SaveChanges 完成后被看到。
從概念上講,當上面的 SaveChanges 代碼被呼叫時,這就是記憶體中發生的情況:
p --> [ John, -1 ] //var p = new Person{Name = "John"}
p --> [ John, -1 ] <-- per //SaveChanges(p), establishes another variable per, pointing at the same in memory data
p --> [ John, 23 ] <-- per //per.Id = random number
p --> [ John, 23 ] //method exits, variable per goes away. p survives and sees changed data
ref是一種允許 SaveChanges 將傳入的 Person 交換為整個newPerson 的機制。如果你有一個 SaveChanges 像:
void SaveChanges(Person per){
per = new Person{ Name = "Jane", Id = 234 }
}
那么記憶體步驟中的物件將如下所示:
p --> [ John, -1 ] //var p = new Person{Name = "John"}
p --> [ John, -1 ] <-- per //SaveChanges(p), establishes another reference called per, pointing at the same in-memory data
p --> [ John, -1 ] per --> [Sarah, 23] //per is reassigned to a new Person created elsewhere in memory
p --> [ John, -1 ] //method exits, variable per goes away. Sarah is vaporized. John was never changed
假設我們使用 ref:
void SaveChanges(ref Person per){
per = new ...
}
ref表示p和per是相同的參考。沒有制作額外的,可以p在指向約翰的同時指向其他地方
想象一下,ref臨時重命名p為per,因此 SaveChanges 方法所做的per = new Person也會影響p. 它可以被認為是這樣的:
p ---------> [ John, -1 ] //var p = new Person{Name = "John"}
per was p -> [ John, -1 ] //SaveChanges(p), establishes another variable per, pointing at the same in memory data
per was p -> [ Sarah, 23] //per = new Person..., John is lost here
p ---------> [ Sarah, 23] //method exits, variable per goes away. p is the only remaining reference,
當 EF Core 保存更改時,它不會用新物體批量替換您傳入的物體;它修改了物體內部的一些資料。ref您的代碼不需要查看它所做的更改
EF 是一個兩步程序甚至無關緊要 - 您將物體傳遞給 Add,EF 將其存盤在內部串列中,當它 SaveChanges() 時,它通過自己的參考訪問資料,但因為只有一個資料,您的變數和 EF 的串列都指向相同的資料,當 EF 更改您的變數看到的資料時,因為它是相同記憶體位置的相同資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400015.html
