我正在研究歷史模型,我得到一個物體,對其進行了修改,然后再次得到相同的物體作為原始物體,并比較它的變化記錄。但我最終得到的是0個變化,經過一些調查,我發現Entity Framework并沒有得到原始物體。它給我的是同一個物體。下面是我的代碼。 在這里我做了一些改變
public async Task<bool>。AssignUserAsync(string userId。int ticketId, string changesAuthor)?
{
var ticket = await GetByIdAsync(ticketId)。
ticket.AssignedUserId = userId;
ticket.Status = Status.Assigned;
var result = await Update(ticket, changesAuthor)。
return result。
}
在這里我呼叫了更新歷史方法
public async Task< bool> Update(Ticket ticket, string user)
{
if (ticket == null)
//拋出例外。
return false。
var ticketChanges = GetTicketChanges(await GetByIdAsync(ticket.Id), ticket, user) 。
await UpdateHistory(ticketChanges)。
ticket.DateUpdated = DateTimeOffset.Now;
var result = await _ticketRepository.UpdateAsync(ticket)。
return result。
}
這是我的GetById
public async Task< Ticket> GetByIdAsync(int id)
{
return await _db.Tickets.
.Include(p => p.Project)
.Include(t => t.Comments)
.Include(p=> p.AssignedUser)
.FirstOrDefaultAsync(p=>p.Id ==id)。
}
在這里,原件和要比較的票據是同一個。我檢查了資料庫,AssignedUserId是不同的
。 public List<History> GetTicketChanges(Ticket originalTicket, Ticket ticketToCompare, string changesAuthor)。
{
List<History> ticketChanges = new();
if (originalTicket == null || ticketToCompare == null)
//拋出例外。
return ticketChanges;
var history = new History
{
DateCreated = DateTimeOffset.Now,
用戶 = changesAuthor,
TicketId = ticketToCompare.Id
};
我洗掉了比較兩個物體的長部分。 我做錯了什么,或者我怎樣才能得到原來的東西呢?
uj5u.com熱心網友回復:
這段代碼不會像你期望的那樣作業,因為默認情況下,DbContext正在跟蹤你正在更新的初始實體,所以告訴DbContext再次檢索該實體將回傳你剛剛更新的同一個參考。
例如:
using (var context = new AppDbContext()
{
var ticket1 = context.Ticks.Single(ticketId);
var ticket2 = context.Ticket.Single(ticketId);
Assert.AreSame(ticket1, ticket2); //NUnit ReferenceEquals[/span]。
}
這將斷言為真,因為DbContext將回傳相同的參考。編輯 ticket1 將導致在 ticket2 上看到這些更改。
另一種方法:
using (var context = new AppDbContext()
{
var ticket1 = context.Ticks.AsNoTracking().Single(ticketId)。
var ticket2 = context.Ticket.AsNoTracking().Single(ticketId)。
Assert.AreSame(ticket1, ticket2); //NUnit ReferenceEquals[/span
}
這個斷言會失敗,因為回傳的實體不會被跟蹤,所以你會收到不同的實體。
通過覆寫 DbContext OnSaveChanges 方法并使用 ChangeTracker 來檢查哪些感興趣的物體可能已被更新、添加或洗掉,然后檢查其內容以建立審計記錄,可以相當容易地完成跟蹤更改等操作。這省去了你再次加載物體進行比較的麻煩。然而,這種方法的注意事項是,它只能在每個物體的基礎上記錄審計變化,而不是在物體的相關圖中記錄。這意味著,票據的變更追蹤器將讓你記錄對票據所做的變更的三角洲,但不包括票據的子參考。(這些將在變更跟蹤器中被單獨跟蹤)
你的問題變得更加復雜。
你的問題由于你所使用的結構而變得更加復雜,你試圖將所有東西都隔離到重復使用的方法中。我曾試著做了一些最小的改動以使其正常作業,但老實說,它最終會變得更加糾結,因為你將不得不開始分離和重新連接參考。一般來說,圍繞重新加載對同一物體的多個單獨的參考來設計并不是一個好主意。 使用分離的物體可以解決這個問題,但我一般不推薦這種方法,因為它可能導致試圖附加和分離整個物件圖的復雜性。(物體及其相關參考)我建議從DbContext中進行變化跟蹤,并允許它從會話狀態中決議當前用戶,(如果是Web應用程式)否則就是當前登錄的用戶,而不是通過各種方法鏈傳遞變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/309872.html
標籤:
上一篇:試圖將資料從資料庫回傳到控制器,得到"如果你使用DataContractSerializer,請考慮使用DataContractResolver"的錯誤。
