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

Я пытаюсь сохранить свой контакт, который имеет ссылки на ContactRelation (только отношения контакта, замужних, одиноких и т. Д.) И страны. Но каждый раз, когда я пытаюсь сохранить мой контакт, который проверяется, я получаю исключение «ADO.Net Entity Framework Объект сущности не может ссылаться на несколько экземпляров IEntityChangeTracker»

public Contact CreateContact(Contact contact) { _entities.AddToContact(contact); //throws the exception _entities.SaveChanges(); return contact ; } 

Я использую слабосвязанный дизайн MVC с услугами и репозиториями. Я прочитал много сообщений об этом исключении, но никто не дает мне рабочий ответ …

Спасибо, Питер

[Обновить]
Поскольку L2E используется, вам нужно сначала сохранить все связанные объекты, прежде чем вы сможете сохранить основной объект. Что имеет смысл, иначе вы бы создали (в моем примере) художника без его контактного объекта. Это не допускается дизайном базы данных.
[/Обновить]

Вот моя работа, которая сработала.

 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create([Bind(Exclude = "Id")] Artist artist, [Bind(Prefix = "Contact")] Contact contact, [Bind(Prefix = "Country")] Country country, [Bind(Prefix = "ContactRelationship")] ContactRelationship contactRelationship) { ViewData["Countries"] = new SelectList(new CountryService(_msw).ListCountries().OrderBy(c => c.Name), "ID", "Name"); ViewData["ContactRelationships"] = new SelectList(new ContactRelationshipService(_msw).ListContactRelationships().OrderBy(c => c.ID), "ID", "Description"); country = _countryService.GetCountryById(country.ID); contact.Country = country; contactRelationship = _contactRelationshipService.GetContactRelationship(contactRelationship.ID); contact.ContactRelationship = contactRelationship; if(_contactService.CreateContact(contact)){ artist.Contact = contact; if (_service.CreateArtist(artist)) return RedirectToAction("Index"); } return View("Create"); } 

И затем в моем ContactRepository:

 public Contact CreateContact(Contact contact) { _entities.AddToContact(contact); //no longer throws the exception _entities.SaveChanges(); return contact ; } 

Я также нашел на этом веб-сайте, что лучше всего поддерживать один и тот же контекст во всем приложении, поэтому я теперь использую для этого специальный class Data:

Рик Стралл и Сэмюэл Маэхем научили меня, что вы должны хранить свой файл данных на пользователя за запрос. Это означает, что он помещается в HttpContext для веб-приложений. Читать все об этом здесь

 public class Data { public static MyDBEntities MyDBEntities { get { if (HttpContext.Current != null && HttpContext.Current["myDBEntities"] == null) { HttpContext.Current["myDBEntities"] = new MyDBEntities (); } return HttpContext.Current["myDBEntities"] as MyDBEntities; } set { if(HttpContext.Current != null) HttpContext.Current["myDBEntities"] = value; } } } 

Я видел это раньше, вам, возможно, придется преобразовать поле Reference в EntityKey перед сохранением, а затем загрузить его после его сохранения. Вместо этого попробуйте использовать этот код:

 public Contact CreateContact(Contact contact){ contact.ConvertContactRelationToReference(); _entities.AddToContact(contact); //throws the exception _entities.SaveChanges(); contact.ContactRelation.Load(); return contact; } public partial class Contact { public void ConvertContactRelationToReference() { var crId = ContactRelation.Id; ContactRelation = null; ContactRelationReference.EntityKey = new EntityKey("MyEntities.ContactRelations", "Id", crId); } } 

Конечно, некоторые из этого кода могут потребоваться изменить в зависимости от вашей точной структуры базы данных.

Ummm Интересно, может ли кто-нибудь угодить здравому смыслу проверить мое решение. Это очень похоже на принятый ответ ниже, но после прочтения блога Rick Strahl о DataContext Life Management я обеспокоен тем, что это не streamовое решение для веб-приложения.

Я также обошел экземпляр, где я получал это сообщение об ошибке, обращаясь к объекту, используя шаблон singleton.

Я добавил в class MyObjectContext следующее:

 // singleton private static MyObjectContext context; public static MyObjectContext getInstance() { if (context == null) { context = new MyObjectContext (); } return context; } 

И в моем ядре репозитория для каждого объекта вместо создания экземпляра нового экземпляра MyObjectContext я использую

 var db = MyObjectContext.getInstance(); 

Я здесь глуп? Кажется, это работает.

  • Как сделать массовую вставку - Linq для объектов
  • Как создать таблицу, соответствующую перечислению в EF6 Code First?
  • LINQ to Entities не распознает метод 'System.String Format (System.String, System.Object, System.Object)'
  • EF 4.1 - Code First - Ошибка серийной ссылки JSON
  • Как изменить тип идентификатора в Microsoft.AspNet.Identity.EntityFramework.IdentityUser
  • Entity Framework - включает несколько уровней свойств
  • Тип одного из выражений в предложении соединения неверен в Entity Framework
  • Объект с тем же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом
  • Представление ограничения FOREIGN KEY может вызвать циклы или несколько каскадных путей - почему?
  • Модель, поддерживающая контекст «ApplicationDbContext», изменилась с момента создания базы данных
  • От одного до одного необязательного отношения с использованием API-интерфейса Entity Framework Fluent
  • Interesting Posts

    Ошибка загрузки Windows 7 после обновления

    Что входит в «Контроллер» в «MVC»?

    Как передать значение с одной jsp на другую страницу jsp?

    Могу ли я выкачать в Mercurial?

    Как предотвратить несанкционированный доступ к моей базе данных Firebase?

    Регулярное выражение позволяет вводить цифры и одну точку

    Монитор Samsung не переходит в режим энергосбережения

    Восстановление файлов с ноутбука с XP, который не загружается

    Есть ли команда, например, «смотреть» или «inotifywait» на Mac?

    Предварительный просмотр текстовых файлов внутри Zip-файлов в Windows 10 File Explorer

    Итерация над объектом JSON в C #

    Почему выражения как значения свойств на сервере-управления приводят к ошибкам компиляции?

    Шрифт от источника был заблокирован от загрузки по политике совместного использования ресурсов Cross-Origin

    Libcurl или cURL не работает OSX Mavericks

    Как найти, какие обещания необработаны в Node.js UnhandledPromiseRejectionWarning?

    Давайте будем гением компьютера.