Видит ли Entity Framework изменение свойства внутри объекта, который уже находится в базе данных?

1

У меня есть два класса моделей:

public class Person {
        public int Id { get; set; }
        public string FirstName { get; set; }
       public virtual List<Desert> Deserts {get;set;}
}
public class Desert{
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual List<Person> Persons{get;set}
}

Если я добавлю некоторых людей в базу данных в методе Seed и добавлю к ним свои любимые десерты:

var deserts = new List<Desert>{new Desert{Name = "IceCream"}, new Desert{Name = "Cake"}}
var persons = new List<Person> { 
                         new Person{FirstName = "James", Deserts = deserts},
                         new Person{FirstName = "Joanna"}
                        };

                persons.ForEach(person => context.Persons.AddOrUpdate(person));
                context.SaveChanges();

Затем где-то в контроллере вызывается метод, который удаляет пустыню от человека (связь/связь между человеком и пустыней):

 //removes desert from a person
 public void RemoveDesert(int personId, int desertToRemoveId) {

            Person person = db.Persons.Find(personId);
            foreach(Desert desert in person.Deserts){
                    if(desert.Id == desertToRemoveId){
                      person.Deserts.Remove(desert);

                   }
            }
            context.saveChanges();
        }

Будет ли Entity Framework видеть, что свойство public virtual List<Desert> FavouriteDeserts {get;set;} изменено и обновлено?

Если нет, как удалить пустыню, у которой Id=desertToRemoveId от человека, у которого есть Id=personId и сохранить изменения в базе данных? Можно ли это сделать без Лямбда-выражений?

  • 0
    это должно работать, не так ли?
  • 0
    лучший способ узнать это проверить ...
Показать ещё 2 комментария
Теги:
entity-framework
asp.net-mvc

1 ответ

0
Лучший ответ

Да, он отслеживает дочерние объекты, если вы не скажете об этом.

foreach(Desert desert in person.Deserts){
                    if(desert.Id == desertToRemoveId){
                      person.Deserts.Remove(desert);

                   }
            }

Я не думаю, что С# позволит вам изменять коллекцию при ее итерации.

Тем не менее, вы всегда можете запросить объект, который хотите удалить, а затем удалить:

var desertToRemove = person.Deserts.FirstOrDefault(x=> x.Id == desertToRemoveId);
if(desertToRemove != null) person.Deserts.Remove(desertToRemove );

Обратите внимание, что это, однако, устраняет только отношение (между человеком и пустыней), а не дочернее. Читайте на этой тонкой разницы в этом отличном ответ здесь.

Кроме того, вам нужно изменить свои классы, чтобы использовать ICollection вместо List:

public virtual ICollection<Person> Persons {get; set; }
public virtual ICollection<Desert> Deserts {get; set;}
  • 0
    Будет ли Entity Framework обновлять таблицы после этой команды person.Deserts.Remove(desertToRemove ); ? Может ли это быть сделано без лямбда-выражения, которое я видел в уроках, что люди использовали SQLish методы в C #.
  • 1
    Когда вы вызываете context.saveChanges(); Да, он обновит базовые таблицы. Я не уверен, что эти методы SQLish и почему вы хотите избежать лямбды.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню