С# Entity Framework "Объект сущности не может ссылаться на несколько экземпляров IEntityChangeTracker"

Эта ошибка вызывается много, но я не могу найти решение. Я новичок в Entity Framework, и в моем первом подходе я получил эту ошибку.

Это то, что у меня есть. У меня есть класс компании и класс веток. Оба класса имеют свой собственный репозиторий. У компании есть один филиал, в то время как один филиал может иметь несколько компаний.

В моем графическом интерфейсе я заполняю комбо с объектами Branch, которые я получаю из своего BranchRepository:

    public IList<Branch> GetAllBranches()
    {
        var query = _context.Branches;

        IList<Branch> branches = query.ToList();

        return branches;
    }

Это результат источника данных ответвления ветки.

Когда я хочу сохранить компанию, я делаю что-то вроде этого:

company.VisitorAddress = txtVisitAddress.Text;
company.City = txtCity.Text;
company.CompanyName = txtCompany.Text;
company.PhoneNumber = txtPhoneNumber.Text;
company.ZipCode = txtZipcode.Text;
company.Branch = ((Branch)cmbBranches.SelectedItem);
company.Website = txtWebsite.Text;

Затем я звоню в репозиторий моей компании, чтобы сохранить свою компанию. Вот как выглядит метод сохранения:

public bool Save(Company company)
{
    _context.AddToCompanies(company);   // <-- This is where the error is thrown.
    _context.SaveChanges();

    return true;
}

Когда вызывается метод сохранения, я получаю сообщение об ошибке "Объект сущности не может ссылаться на несколько экземпляров IEntityChangeTracker".

Ясно, что я делаю что-то неправильно, но что?

Ответы

Ответ 1

Создаете ли вы новый экземпляр ObjectContext для каждого вашего репозитория? Это может быть источником проблемы, потому что когда вы добавляете Branche в компанию, она пытается добавить его в экземпляр ObjectContext, который не может быть выполнен, потому что он все еще связан с экземпляром ObjectContext, который используется для заполнения combobox. Путь к тому, чтобы разделить экземпляр ObjectContext среди ваших репозиториев. Другая возможность заключается в Detach Branch из первого репозитория, но может иметь и другие последствия.