Entity Framework, проблемы с обновлением связанных объектов
В настоящее время я работаю над проектом с использованием последней версии Entity Framework, и я столкнулся с проблемой, которую, похоже, не могу решить.
Когда дело доходит до обновления существующих объектов, я могу довольно легко обновлять свойства объекта, пока не дойдет до свойства, которое является ссылкой на другой класс.
В приведенном ниже примере у меня есть класс с именем Foo, который хранит различные свойства, причем 2 из них являются экземплярами других классов
public class Foo
{
public int Id {get; set;}
public string Name {get; set;}
public SubFoo SubFoo {get; set}
public AnotherSubFoo AnotherSubFoo {get; set}
}
Когда я использую нижеEdit()
метод, я передаю объект, который я хочу обновить, и я могу получитьName
для правильного обновления, однако мне не удалось найти способ получить свойства SubFoo для изменения. Например, еслиSubFoo
класс имеет свойствоName
, и это было изменено и отличается между моей БД иnewFoo
, он не обновляется.
public Foo Edit(Foo newFoo)
{
var dbFoo = context.Foo
.Include(x => x.SubFoo)
.Include(x => x.AnotherSubFoo)
.Single(c => c.Id == newFoo.Id);
var entry = context.Entry(dbFoo);
entry.OriginalValues.SetValues(dbFoo);
entry.CurrentValues.SetValues(newFoo);
context.SaveChanges();
return newFoo;
}
Любая помощь или указатели будут с благодарностью.
ОБНОВЛЕНИЕ: Основываясь на комментарии Слаумы, я изменил свой метод на
public Foo Edit(Foo newFoo)
{
var dbFoo = context.Foo
.Include(x => x.SubFoo)
.Include(x => x.AnotherSubFoo)
.Single(c => c.Id == newFoo.Id);
context.Entry(dbFoo).CurrentValues.SetValues(newFoo);
context.Entry(dbFoo.SubFoo).CurrentValues.SetValues(newFoo.SubFoo);
context.SaveChanges();
return newFoo;
}
При запуске этого сейчас я получаю ошибку:
Тип сущности Collection`1 не является частью модели для текущего контекста.
Чтобы попытаться обойти это, я добавил код, чтобы попытаться прикрепитьnewFoo
подклассы к контексту, но это из-за ошибки, говорящей, чтоObjectManager
уже была сущность такая же:
Объект с таким же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом