Обновление внешнего ключа (сущности) с помощью сущности V1 - PullRequest
3 голосов
/ 03 октября 2009

У меня есть небольшое приложение ASP.NET MVC со следующими объектными объектами:

лицо

  • PersonId
  • Имя (строка)
  • FirstName (строка)
  • Страна (Страна)

Страна

  • CountryId
  • Имя

Я могу добавить и удалить объект, это прекрасно работает. Я также могу обновить имя, имя. Но как я могу обновить свойство страны с другой страной.

я пытался

p.Country = (from c in db.Country 
             where c.CountryId == countryId 
             select c).First();

но это вызывает исключение {"Объект с таким же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом."} "

даже до того, как я вызову SaveChanges для текста данных.

Может кто-нибудь объяснить, как я могу обновить это свойство?

С уважением Дитер

Ответы [ 4 ]

2 голосов
/ 03 октября 2009

Является ли db вашим контекстом? Вы должны быть в состоянии сделать:

p.Country = ctx.Country.First(c => c.CountryId == countryId);

Или, если вы не хотите запрашивать базу данных, чтобы получить сущность внешнего ключа, вы также можете использовать EntityKey с тем же эффектом:

p.CountryReference.EntityKey = new EntityKey("MyDb.Country", "CountryId", countryId);
0 голосов
/ 03 декабря 2009

Вот что у меня сработало. В модели:

<%= Html.Textbox("Country.CountryId", Model.Countries) %> // I'm using a form model view

В контроллере:

Person originalPerson = (from p in db.PersonSet
                        where p.PersonId == updatedPerson.PersonId
                        select p).First();

Country country = (from c in db.CountrySet 
                  where c.CountryId == updatePerson.Country.CountryId 
                  select c).First();

db.Attach(country);
originalPerson.Country = country;
db.ApplyPropertyChanges(originalPerson.EntityKey.EntitySetName, updatedPerson);
db.Savechanges();
0 голосов
/ 04 октября 2009

Код, подобный этому, работал для меня при обновлении свойств навигации.

   Country country = new Country{CountryId = theNewCountryID };
    db.AttachTo("Countries", country);
    p.Country = country;
    db.Savechanges();

Создайте заглушку новой страны, затем присоедините ее к странам EntitySet, назначьте новую страну для свойства страны навигации вашей сущности и вызовите SaveChanges (). Используйте имя EntitySet вашей страны в вызове AttachTo.

0 голосов
/ 03 октября 2009

Я использовал второе решение и не получил исключения, но CountryId не изменился в базе данных даже после вызова AcceptChanges.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...