Изменение отношения / внешнего ключа в Entity Framework - не сохраняется - PullRequest
1 голос
/ 06 августа 2009

Я получил приложение 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 присоединены к одному и тому же контексту.

Извините за длину этого поста, но я серьезно не знаю, что здесь происходит, и я постарался предоставить как можно больше подробностей, которые могут помочь. Пожалуйста, спросите, поможет ли вам дополнительная информация.

Заранее спасибо.

1 Ответ

1 голос
/ 08 августа 2009

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

Вы не опубликовали код, в котором вы создаете переменную newSite, но при установке внешних ключей в EF вы делаете это иначе, чем в Linq или просто работаете в базе данных. С EF, вы должны выбрать IN значение внешнего ключа, которое вы хотите установить для вашего объекта, а затем установить его.

Это не будет работать:

NewSite = Site.CreateSite("PrimaryKeyValue");
keyToMove.Site = NewSite;

Вместо этого вы делаете что-то вроде этого:

NewSite = MyEntities.Site.Where(site=>site.PrimaryKey==PrimaryKeyValue)
                                .FirstOrDefault();
keyToMove.Site = NewSite;

Надеюсь, я понял ваш вопрос!

С уважением, Mike

...