С# 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 из первого репозитория, но может иметь и другие последствия.