В настоящее время я работаю над проектом с использованием последней версии Entity Framework, и я столкнулся с проблемой, которую я, похоже, не могу решить.
Когда дело доходит до обновления существующих объектов, я могу довольно легко обновить свойства объекта ok, пока не дойдет до свойства, которое является ссылкой на другой класс.
В приведенном ниже примере у меня есть класс 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
, и это было изменено и отличается от моего DB и 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<Foo>(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 не может отслеживать несколько объектов с одним и тем же ключом