У меня есть следующий код для функции EndEdit
объекта, который реализует IEditable
:
public void EndEdit()
{
using (var db = new Context())
{
if (Id == Guid.Empty)
{
db.Add(this);
db.SaveChanges();
}
else
{
var worklog = db.Find<Worklog>(Id);
worklog.Comment = Comment;
worklog.JiraIssue = JiraIssue;
worklog.Ticks = Ticks;
worklog.StartDate = StartDate;
db.SaveChanges();
}
}
}
После выполнения редактирования объекта db.Entry
показывает одну сущность в контексте ссостояние изменено, что я и ожидал.Однако, когда я вызываю db.SaveChanges
после выполнения блока else, я получаю следующее сообщение об ошибке:
Не удается отследить экземпляр типа сущности 'Worklog', поскольку другой экземпляр со значением ключа '{Id:b8476f6e-aab6-408f-ab75-f4944b9a0262} 'уже отслеживается.При подключении существующих объектов убедитесь, что подключен только один экземпляр объекта с данным значением ключа.
Может ли это быть как-то связано с тем, что я пытаюсь сохранить объект IEditable
непосредственно вбаза данных?
Очень запутан, любая помощь будет приветствоваться!
Трассировка стека:
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)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`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)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState entityState, Boolean acceptChanges, Nullable`1 forceStateWhenUnknownKey)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.PaintAction(EntityEntryGraphNode node, Boolean force)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph[TState](EntityEntryGraphNode node, TState state, Func`3 handleNode)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph[TState](EntityEntryGraphNode node, TState state, Func`3 handleNode)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.AttachGraph(InternalEntityEntry rootEntry, EntityState entityState, Boolean forceStateWhenUnknownKey)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NavigationFixer.NavigationReferenceChanged(InternalEntityEntry entry, INavigation navigation, Object oldValue, Object newValue)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntryNotifier.NavigationReferenceChanged(InternalEntityEntry entry, INavigation navigation, Object oldValue, Object newValue)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.DetectNavigationChange(InternalEntityEntry entry, INavigation navigation)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.DetectChanges(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.DetectChanges(IStateManager stateManager)
at Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker.DetectChanges()
at Microsoft.EntityFrameworkCore.DbContext.TryDetectChanges()
at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
at Microsoft.EntityFrameworkCore.DbContext.SaveChanges()
at TimeTracker.ViewModels.WorklogViewModel.EndEdit() in C:\TimeTracker\ViewModels\WorklogViewModel.cs:line 120
Класс сущности:
public class Worklog: IGuidEntity
{
public Guid Id { get; set; }
public DateTime StartDate { get; set; } = DateTime.Now;
public string Comment { get; set; }
public long Ticks { get; set; }
public bool Completed { get; set; }
public bool Published { get; set; }
public virtual JiraIssue JiraIssue { get; set; }
public virtual ICollection<TimeTrackerWorklog> OriginalWorklogs { get; set; }
public virtual TimeTrackerWorklog UserModifiedWorklog { get; set; }
}
ViewModel:
public class WorklogViewModel : Worklog, IEditableObject
{
public void BeginEdit()
{
return;
}
public void EndEdit()
{
using (var db = new TimeTrackerContext())
{
if (Id == Guid.Empty)
{
db.Add(this);
db.SaveChanges();
}
else
{
var worklog = db.Find<TimeTrackerWorklog>(Id);
worklog.Comment = Comment;
worklog.JiraIssue = JiraIssue;
worklog.Ticks = Ticks;
worklog.StartDate = StartDate;
db.SaveChanges();
}
}
}
public void CancelEdit()
{
return;
}
}