Entity framework обновляет внешний ключ до нуля без запроса и без идентификатора связанного объекта

Используя EF 6.1, я хочу установить для внешнего ключа значение null (разорвать связь между двумя объектами) без предварительного запроса какого-либо объекта. Предпочтительно, я также не хочу указывать идентификатор связанного объекта (поскольку для этого требуется добавить его в мой HTML).

Мой текущий код не выполняет ненужных запросов, но требует идентификатор связанного объекта:

public void RemoveCurrentTeacherOfGroup(int groupId, int teacherId)
{
    var group = new Group { Id = groupId };
    var teacher = new Teacher { Id = teacherId };
    group.Teacher = teacher;
    _dataContext.Groups.Attach(group);
    _dataContext.Teachers.Attach(teacher);

    group.Teacher = null;

    _dataContext.SaveChanges();
}

Однако мне не нужен идентификатор учителя, достаточно информации о группе.

Дополнительная информация: база данных была сгенерирована с использованием кода. Сущности определяются следующим образом:

public class Teacher
{
    public int Id { get; set; }
    ..
    public virtual List<Group> Groups { get; set; }
}
public class Group
{
    public int Id { get; set; }
    ..
    public virtual Teacher Teacher { get; set; }
}

Есть ли способ установить внешний ключ равным нулю без учителя Id?

Кроме того, большое спасибо за ответ, который делает код менее подробным, я чувствую, что это слишком много строк для чего-то такого простого, как установка внешнего ключа на ноль.


person mnwsmit    schedule 23.01.2015    source источник


Ответы (1)


Жизнь, как правило, намного проще, если вы добавите внешний ключ в класс:

public class Group
{
    public int Id { get; set; }
    public int? TeacherId { get; set; }
    public virtual Teacher Teacher { get; set; }
}

И тогда ваш метод:

public void RemoveCurrentTeacherOfGroup(int groupId)
{
   var group = dataContext.Groups.Find(groupId);
   if(group == null)
     return;
   group.TeacherId = null;
   _dataContext.SaveChanges();
}

Рекомендации:

Почему Entity Framework повторно вставляет существующие объекты в мою базу данных?

Что делать с отсутствующими внешними ключами

person Colin    schedule 23.01.2015
comment
Извините, не могу пометить это как ответ, потому что Find(groupId) выполнит дополнительный запрос (если только dataContext не кэшируется, что усложнит архитектуру и создаст множество возможных проблем) - person mnwsmit; 02.03.2015
comment
Вы хотите удалить Teacher из Group, когда ни один из них не прикреплен к DbContext? И вы хотите использовать Entity Framework? - person Colin; 02.03.2015
comment
Я хочу сделать это да, желательно с EF. Однако это невозможно с EF, может быть ответом, я не знаю, так ли это - person mnwsmit; 02.03.2015