Удаление элемента из списка в модели EF

Я использую Entity Framework и пытаюсь удалить NinjqEquiment из списка, принадлежащего экземпляру Ninja.Когда я получаю список ниндзя, я обязательно включаю список оборудования, поэтому я знаю, что они там. Затем снимаю снаряжение с ниндзя и пытаюсь сохранить изменения. Я получаю следующую ошибку —

Список типов сущностей ‘ 1 не является частью модели для текущего
контекст.

 using (var db = new NinjaDbContext())
        {
            //get ninjas with equipment included
            var ninjas = GetAllNinjas();

            //get ninja
            var ninja = (from n in ninjas
                         where n.Id == id
                         select n).FirstOrDefault();


            //get equipment
            var eq = (from e in ninja.EquipmentOwned
                      where e.Id == removeEqId
                      select e).FirstOrDefault();

            //remove eq from ninja
            ninja.EquipmentOwned.Remove(eq);

            //Make sure entity knows EquipmentOwned has been modified
            db.Entry(ninja.EquipmentOwned).State = EntityState.Modified;

            //save ninja
            db.SaveChanges();


        }

1 ответ

  1. Просто удалите это:

            //Make sure entity knows EquipmentOwned has been modified
            db.Entry(ninja.EquipmentOwned).State = EntityState.Modified;
    

    Это вызывает ошибку.

    EquipmentOwned is a List<Equipment>. Это не Entryв EFтерминах, поэтому он не отслеживается непосредственно им.

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

    Чтобы удалить его полностью, вы должны удалить это оборудование из соответствующегоDbSet<>, как это:

    using (var db = new NinjaContext())
    {
        //db.Equipment is a DbSet<Equipment>
        //id is PrimaryKey of Equipment table
        var eq = db.Equipment.Find(id);
        db.Equipment.Remove(eq);
        db.SaveChanges();
    }