Это довольно очевидно. У меня есть класс, который содержит еще один. Назовем их "Тема" и "Класс".

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();
    }
2
Alvaro 22 Окт 2012 в 03:45

1 ответ

Лучший ответ

Трудно сказать, не видя фактического кода того, как вы обновляете или создаете свою сущность Subject. Однако вы, вероятно, не подключаете Класс, поэтому EF предполагает, что объект новый, хотя на самом деле это не так.

     using (Model m = new Model())
     {
        m.Subject.Add(subject);
        m.Classrooms.Attach(subject.Class);
        m.SaveChanges();           
     }

Несмотря на то, что PK такой же, без присоединения к контексту EF не имеет возможности выяснить, что вы намерены. Присоединение сущности явно сообщает вашему контексту, чего вы хотите.

5
Mark Oreta 22 Окт 2012 в 05:19
Спасибо, это может сработать! Я использовал аналогичный код, но я определил общий метод для вставки моих сущностей, взяв общий объект: public void Insert (DataSet dSet, object obj) {dSet.Add (obj); this.SaveChanges (); } Итак, я думаю, что нет способа сделать это с таким анонимным состоянием.
 – 
Alvaro
22 Окт 2012 в 06:10
Он добавляет внешний ключ, но заставляет вставить ... Я хочу, чтобы он просто сохранил внешний ключ
 – 
RollRoll
16 Апр 2016 в 22:18
1
Спасибо, что работает. это раздражает. Если у модели есть идентификатор, ожидается, что EF знает, что это не новый идентификатор. но еще раз спасибо.
 – 
jcmordan
25 Янв 2017 в 06:24