简体   繁体   中英

EF Core 2 throws exception on SaveChanges, after first update for related entities

hi :) i ran in to a problem with editing/updating entries in db which has related entities. i am able to edit any entry once, and after that i am not able to update any dependent entity wich has the same principal entity, as the entity i already modified

i have spend last 5 days or so, trying to solve this. all the advice that i have found on the net, did not work :(

u can see the project @: https://github.com/nedimbih/WorkNotes
problematic part is this:

public partial class Work
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }


    public virtual Worker Worker { get; set; }

    public DateTime Date { get; set; }
    public TimeSpan StartingTime { get; set; }
    public float Duration { get; set; }
    public string Note { get; set; }
}

and

public partial class Worker : IdentityUser
{

    public Worker() => WorksDoneByWorker = new HashSet<Work>();


    public virtual  ICollection<Work> WorksDoneByWorker { get; set; }
}

In WorkRepository.cs i have this code

 internal int Update(Work input)
    {

        Work workInDb = _context.WorkList
                                .Include(w => w.Worker)
                                .FirstOrDefault(w => w.Id == input.Id);

        if (workInDb != null)
        // v.1
        // {workInDb = input;}
        // v.2
        {
            workInDb.Note = input.Note;
            workInDb.StartingTime = input.StartingTime;
            workInDb.Duration = input.Duration;
            workInDb.Date = input.Date;
            workInDb.Worker = input.Worker;
        }
        int savedEntries;
        try
        {
            savedEntries = _context.SaveChanges();
        }
        catch (Exception)
        {
            savedEntries = 0;
            // used as a flag. Calling code acts upon it
        }
        return savedEntries;
    }

i can make updates on work entries only once, for a given worker.
after i edit/update one work entry (savedEntries holds value 2), i can no longer update any entry with same worker as updated entry. i get exception on SaveChanges saying that Worker with same id is already being tracked.
if i turn of line workInDb.Worker=input.Worker then it saves, but that is not functionality that i need.
if i turn on v.1 code instead of v.2 i get no exception but SaveChanges does nothing.
count of modified entries (in context) is 0 in both cases.

thx :)

I don't think your model is right. Try this:

public partial class Work
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }

public int WorkerId { get; set; }
public Worker Worker { get; set; }

public DateTime Date { get; set; }
public TimeSpan StartingTime { get; set; }
public float Duration { get; set; }
public string Note { get; set; }
}

and the instead of setting the worker set its Id like this:

 workInDb.WorkerId = input.Worker.Id;

This will prevent EF of trying to create and store a new Worker with the same Id, but instead in adding a relation to the existing worker.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM