Я получил приложение WPF по образцу Model View ViewModel, использующее Entity Framework для взаимодействия с базой данных SQL 2008.
Задача
Моя проблема в том, что я не могу изменить значение внешнего ключа в базе данных с помощью EF. У меня есть две сущности: сайт и ключ. На сайте может быть много ключей. Я хотел бы переместить ключ с одного сайта на другой. Я пытаюсь сделать это, используя следующий код:
keyToMove.Site = newSite;
dataAccess.SaveChanges(); // this method just does: this.entities.SaveChanges();
То, что я наблюдал
Похоже, в памяти все в порядке, поскольку остальная часть приложения отражает это изменение (ключ появится под новым сайтом). Однако внешний ключ в базе данных не изменяется, и после закрытия и перезапуска приложения все изменения теряются.
После "keyToMove.Site = newSite;", keyToMove, newSite и старый экземпляр сайта имеют значение EntityState "Не изменено", что не может быть правильным. Также SaveChanges возвращает 2, что просто смущает меня еще больше.
Реализация сеттера для свойства «Сайт» похожа на другие свойства навигации в моей модели:
set
{
((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<Site>("CmsModel.SiteKeyAssociation", "Site").Value = value;
}
SQL Profiler показывает, что ничего, напоминающее UPDATE, не отправляется в механизм db, только очень и очень длинный SELECT.
Вещи, которые могут оказать влияние
Объект "Ключ" наследуется от другого объекта на основе условия, примененного к одному из столбцов.
Я использую контейнер AutoFac IOC для предоставления моделям ViewModel, которые хотят получить доступ к некоторым данным, ссылки на экземпляр моего класса доступа к данным (в данном примере «dataAccess»).
Экземпляр ObjectContext является членом этого класса (показан в комментариях как "this.entities").
Экземпляр dataAccess имеет одноэлементную область, поэтому должен быть доступен только один экземпляр для моделей представления, например. и keyToMove, и newSite присоединены к одному и тому же контексту.
Извините за длину этого поста, но я серьезно не знаю, что здесь происходит, и я постарался предоставить как можно больше подробностей, которые могут помочь. Пожалуйста, спросите, поможет ли вам дополнительная информация.
Заранее спасибо.