В зависимости от того, как долго ваш DbContext остается открытым, он может быть уже связан с сущностью.Например, если вы перебираете наборы Medico и два имеют один и тот же Espacialidad, первый присоединится, а второй выдает ошибку.
Перед присоединением сущности к DbContext вы всегда должны проверить, является лиобъект уже присоединен:
foreach (Especialidad especialidad in medico.Especialidad)
{
if (!this.context.Especialidad.Local.Any(x => x == especialidad))
this.context.Especialidad.Attach(especialidad);
}
Редактировать: Для многих ко многим без двунаправленных ссылок.
Удалить коллекцию Medico из Especialidad
Где вы в настоящее время наносите картудокторов как-то так:
HasMany(x => x.Especialidad)
.WithMany(x => x.Medico)
.Map(x =>
{
x.ToTable("Medico_Especialidad");
x.MapLeftKey("MedicoID");
x.MapRightKey("EspecialidadID");
});
... это изменится на:
HasMany(x => x.Especialidad)
.WithMany() // Note the empty return reference.
.Map(x =>
{
x.ToTable("Medico_Especialidad");
x.MapLeftKey("MedicoID");
x.MapRightKey("EspecialidadID");
});
Любой код, который вам может потребоваться для получения врачей по специальности, который может использовать Especialidad.Medico будетнеобходимо изменить для разрешения со стороны Доктора, т.е.
вместо:
var medicos = context.Especialidad.Find(especialidadID).Medico
будет выглядеть примерно так:
var medicos = context.Medico.Where(x => x.Especialidad.Any(e => e.ID == especialidadID)).ToList();
Когда речь идет об отношениях «многие ко многим» или «многие к одному», для упрощения кода и предотвращения путаницы ссылок, как правило, рекомендуется избегать двунаправленных ссылок, если толькоэй абсолютно необходимы.Часть проблемы, которую приносят двунаправленные ссылки, заключается в том, что когда A ссылается на B, а B ссылается на A, вам необходимо убедиться, что контекст разрешает одинаковые A и B с обеих сторон.При отсоединении и повторном присоединении объектов к контексту это вызовет горе либо из-за ошибок ассоциации, либо из-за дубликатов ошибок вставки PK.