Как я могу исправить «Экземпляр типа сущности XXX не может быть отслежен» при выполнении только db.SaveChangges () - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующий код для функции 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;
    }
}
...