Я пытаюсь сохранить данные сотрудника, на которые есть ссылки с City. Но каждый раз, когда я пытаюсь сохранить свой контакт, который проверяется, я получаю исключение "ADO.Net Entity Framework. Объектный объект не может быть указан несколькими экземплярами IEntityChangeTracker"
Я прочитал так много постов, но до сих пор не получил точного представления о том, что делать ... мой код нажатия кнопки Сохранить приведен ниже
protected void Button1_Click(object sender, EventArgs e)
{
EmployeeService es = new EmployeeService();
CityService cs = new CityService();
DateTime dt = new DateTime(2008, 12, 12);
Payroll.Entities.Employee e1 = new Payroll.Entities.Employee();
Payroll.Entities.City city1 = cs.SelectCity(Convert.ToInt64(cmbCity.SelectedItem.Value));
e1.Name = "Archana";
e1.Title = "aaaa";
e1.BirthDate = dt;
e1.Gender = "F";
e1.HireDate = dt;
e1.MaritalStatus = "M";
e1.City = city1;
es.AddEmpoyee(e1,city1);
}
и Кодекс обслуживания сотрудников
public string AddEmpoyee(Payroll.Entities.Employee e1, Payroll.Entities.City c1)
{
Payroll_DAO1 payrollDAO = new Payroll_DAO1();
payrollDAO.AddToEmployee(e1); //Here I am getting Error..
payrollDAO.SaveChanges();
return "SUCCESS";
}
Form
( во всяком случае , он просто представляет одну единицу работы) для каждогоThread
(потому чтоDbContext
не гарантируется поточная безопасность).Шаги для воспроизведения можно упростить до этого:
Код без ошибок:
Использование только одного
EntityContext
может решить эту проблему. Обратитесь к другим ответам для других решений.источник
Это старый поток, но другое решение, которое я предпочитаю, это просто обновить cityId и не назначать модель дырки City для Employee ..., чтобы Employee должен выглядеть так:
Тогда достаточно присвоить:
источник
В качестве альтернативы инъекции и, что еще хуже, Singleton, вы можете вызвать метод Detach перед Add.
EntityFramework 6:
((IObjectContextAdapter)cs).ObjectContext.Detach(city1);
EntityFramework 4:
cs.Detach(city1);
Есть еще один способ, если вам не нужен первый объект DBContext. Просто оберните это с помощью ключевого слова:
источник
dbContext1.Entry(backgroundReport).State = System.Data.Entity.EntityState.Detached
«отсоединить, а затем смог использоватьdbContext2.Entry(backgroundReport).State = System.Data.Entity.EntityState.Modified;
для обновления. Работал как мечтаУ меня была та же проблема, но моя проблема с решением @ Slauma (хотя в некоторых случаях это здорово) заключается в том, что он рекомендует передать контекст в службу, что подразумевает, что контекст доступен из моего контроллера. Это также вызывает тесную связь между моим контроллером и сервисными уровнями.
Я использую Dependency Injection, чтобы внедрить слои сервиса / репозитория в контроллер и поэтому не имею доступа к контексту из контроллера.
Мое решение состояло в том, чтобы слои сервиса / хранилища использовали один и тот же экземпляр контекста - Singleton.
Контекст Singleton Class:
Ссылка: http://msdn.microsoft.com/en-us/library/ff650316.aspx
и http://csharpindepth.com/Articles/General/Singleton.aspx
Репозиторий Класс:
Существуют и другие решения, такие как создание экземпляра контекста один раз и передача его в конструкторы уровней вашего сервиса / хранилища, или другое, о котором я читал, которое реализует шаблон Unit of Work. Я уверен, что есть еще ...
источник
В моем случае я использовал ASP.NET Identity Framework. Я использовал встроенный
UserManager.FindByNameAsync
метод для полученияApplicationUser
объекта. Затем я попытался сослаться на эту сущность на новую созданную сущность на другуюDbContext
. Это привело к исключению, которое вы изначально видели.Я решил это, создав новую
ApplicationUser
сущность толькоId
сUserManager
методом from и ссылаясь на эту новую сущность.источник
У меня была та же проблема, и я мог решить создать новый экземпляр объекта, который я пытался обновить. Затем я передал этот объект в свое хранилище.
источник
В этом случае оказывается, что ошибка предельно ясна: Entity Framework не может отслеживать сущность, используя несколько экземпляров
IEntityChangeTracker
или, как правило, несколько экземпляровDbContext
. Решения: использовать один экземплярDbContext
; получить доступ ко всем необходимым объектам через один репозиторий (в зависимости от одного экземпляраDbContext
); или отключение отслеживания для всех сущностей, к которым обращаются через репозиторий, кроме того, который выбрасывает это конкретное исключение.Следуя инверсии шаблона управления в .Net Core Web API, я часто обнаруживаю, что у меня есть контроллеры с такими зависимостями, как:
и использование как
Поскольку все три репозитория зависят от разных
DbContext
экземпляров на запрос, у меня есть два варианта, чтобы избежать проблемы и поддерживать отдельные репозитории: изменить внедрение DbContext, чтобы создать новый экземпляр только один раз за вызов:или, если дочерняя сущность используется только для чтения, отключение отслеживания в этом экземпляре:
источник
Используйте один и тот же объект DBContext во всей транзакции.
источник
Я столкнулся с этой же проблемой после внедрения IoC для проекта (ASP.Net MVC EF6.2).
Обычно я инициализирую контекст данных в конструкторе контроллера и использую тот же контекст для инициализации всех моих репозиториев.
Однако использование IoC для создания экземпляров репозиториев привело к тому, что все они имели разные контексты, и я начал получать эту ошибку.
Сейчас я вернулся к обновлению репозиториев с общим контекстом, пока думаю о лучшем пути.
источник
Вот как я столкнулся с этой проблемой. Сначала мне нужно сохранить мой,
Order
который нуждается в ссылке на моюApplicationUser
таблицу:Проблема в том, что я инициализирую новый ApplicationDbContext, чтобы сохранить мою новую
Order
сущность:Поэтому, чтобы решить проблему, я использовал тот же ApplicationDbContext, а не встроенный UserManager ASP.NET MVC.
Вместо этого:
Я использовал свой существующий экземпляр ApplicationDbContext:
источник
Источник ошибки:
Надеюсь, кто-то экономит драгоценное время
источник