我試圖使用Entity Framework Core(C#與ASP .NET Core)來更新資料庫(PostgreSQL)中的條目,當一個具有Id的條目已經存在時,但這并不奏效:
public async 任務 SaveFileInfos(FileInfo fileInfo)
{
var foundFileInfo = _context.FileInfos.Where(f => f.FileId ==fileInfo.FileId).FirstOrDefault()。
if (foundFileInfo == null)
{
await _context.FileInfos.AddAsync(fileInfo)。
}
else
{
_context.FileInfos.Update(fileInfo)。
}
await _context.SaveChangesAsync()。
順便說一下,Id不能是一個GUID,因為它必須是34位數。
public class FileInfo : IFileInfo
{
[Key] 。
public string FileId { get; set; }
public string FileName { get; set; }
如果我想改變一個已經包含的條目,我會得到如下的例外:
System.InvalidOperationException: 物體型別的實體'FileInfo'不能被追蹤,因為另一個具有相同鍵值的{'FileId'}實體已經被追蹤了。當附加現有物體時,確保只附加一個具有給定鍵值的物體實體。考慮使用'DbContextOptionsBuilder.EnableSensitiveDataLogging'來查看沖突的鍵值。
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`1.ThrowIdentityConflict(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`1.Add(TKey key, InternalEntityEntry entry, Boolean updateDuplicate)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`1.Add(TKey key, InternalEntityEntry entry)
在Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NullableKeyIdentityMap`1.Add(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTracking(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState oldState, EntityState newState, Boolean acceptChanges, Boolean modificationProperties)
在Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState entityState, Boolean acceptChanges, Boolean modifyProperties, Nullable`1 forceStateWhenUnknownKey)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.PaintAction(EntityEntryGraphNode`1 node)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph[TState](EntityEntryGraphNode`1 node, Func` 2 handleNode)
在Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.AttachGraph(InternalEntityEntry rootEntry, EntityState targetState, EntityState storeGeneratedWithKeySetTargetState, Boolean forceStateWhenUnknownKey)
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.SetEntityState(InternalEntityEntry entry, EntityState entityState)
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.Update(TEntity entity)
我做錯了什么?這一定是一個初學者的錯誤;-)
uj5u.com熱心網友回復:
EF對被追蹤的物體進行了更新。在這種情況下,foundFileInfo是被追蹤的物體,而對于EF來說fileInfo是一個新的條目。
因此,如果你想更新這個條目,請嘗試使用被追蹤的物體。例如:
public async 任務 SaveFileInfos(FileInfo fileInfo)
{
var foundFileInfo = _context.FileInfos.FirstOrDefault(f => f.FileId == fileInfo.FileId)。
if (foundFileInfo == null)
{
await _context.FileInfos.AddAsync(fileInfo)。
}
else
{
foundFileInfo.FileName = fileInfo.FileName。
}
await _context.SaveChangesAsync()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328649.html
標籤:
