Это довольно очевидно. У меня есть класс, который содержит еще один. Назовем их "Тема" и "Класс".
public class Subject
{
public Classroom Class {get; set;}
}
Я использую фасады без сохранения состояния, что означает, что мой DbContext удаляется сразу после восстановления объектов и создается для хранения новых. Разве он не должен знать, что Класс - не новый объект, поскольку его идентификатор уже находится в БД? Используя отладчик, я могу отследить точку прямо перед вызовом метода SaveChanges, а Classroom.id - это тот, который у меня есть в базе данных. В чем проблема? EF добавляет новый класс с теми же свойствами, что и предыдущий, но с новым PK. Что я здесь делаю не так?
Это код, используемый для общих операций CRUD (они находятся в моем DbContext) И обновление, и удаление работают нормально:
public void Update(DbSet MySet, object Obj)
{
MySet.Attach(Obj);
var Entry = this.Entry(Obj);
Entry.State = EntityState.Modified;
this.SaveChanges();
}
public void Insert(DbSet MySet, object Obj)
{
MySet.Add(Obj);
this.SaveChanges();
}
public void Delete(DbSet MySet, object Obj)
{
MySet.Attach(Obj);
var Entry = this.Entry(Obj);
Entry.State = EntityState.Deleted;
this.SaveChanges();
}
1 ответ
Трудно сказать, не видя фактического кода того, как вы обновляете или создаете свою сущность Subject
. Однако вы, вероятно, не подключаете Класс, поэтому EF предполагает, что объект новый, хотя на самом деле это не так.
using (Model m = new Model())
{
m.Subject.Add(subject);
m.Classrooms.Attach(subject.Class);
m.SaveChanges();
}
Несмотря на то, что PK такой же, без присоединения к контексту EF не имеет возможности выяснить, что вы намерены. Присоединение сущности явно сообщает вашему контексту, чего вы хотите.
Похожие вопросы
Связанные вопросы
Новые вопросы
entity-framework
Entity Framework — это основанный на LINQ сопоставитель базы данных объектов для .NET. Он поддерживает отслеживание изменений, обновления и миграцию схем для многих баз данных. Также добавьте тег для конкретной версии.