【问题标题】:Cannot delete last item from the ICollection无法从 ICollection 中删除最后一项
【发布时间】:2015-02-12 23:03:31
【问题描述】:

我正在尝试从集合中删除最后一项,但它不起作用。我首先使用 MVC 4 和 EF 代码。我生成所有视图和控制器并添加带有复选框的模块,每个复选框都用于一个类型集合的对象。

这是我的模型:

{
    public class Efekt
    {
        public int ID { get; set; }
        public string Symbol { get; set; }
        public string Typ { get; set; }

        [DataType(DataType.MultilineText)]
        public string Opis { get; set; }

        [DataType(DataType.MultilineText)]
        public string Odnosnik
        {
            get
            {
                (...)
            }

           // set;
        }

        public virtual ICollection<Obszarowe> EfektyObszarowe { get; set; }
        public virtual ICollection<Przedmiot> Przedmioty { get; set; }

        public Efekt(){

        }

        public Efekt(string symbol,string opis,string odnosnik){

           (...)
        }
    }
}


{
    public class Obszarowe
    {
        public int ID { get; set; }
        public string Symbol { get; set; }
        public string Typ { get; set; }

        [DataType(DataType.MultilineText)]
        public string Opis { get; set; }

        [DataType(DataType.MultilineText)]
        public string Odnosnik
        {
            get
            {
                (...)
            }

            // set;
        }

        public virtual ICollection<Efekt> EfektyKierunkowe { get; set; }

        public Obszarowe(){

        }

        public Obszarowe(string symbol, string opis, string odnosnik)
        {

            (...)
        }
    }
}

以及efektcontroller中的编辑功能

 public ActionResult Edit(int id = 0)
        {
            Efekt efekt = db.Efekts.Find(id);
            if (efekt == null)
            {
                return HttpNotFound();
            }
            EfektyObszarowe(efekt);
            return View(efekt);
        }

        private void EfektyObszarowe(Efekt efekt)
        {
            var allObszarowe = db.EfektyObszarowe;
            var kierunkoweObszarowe = new HashSet<int>(efekt.EfektyObszarowe.Select(c => c.ID));
            var viewModel = new List<KierunkoweObszarowe>();
            foreach (var obszar in allObszarowe)
            {
                viewModel.Add(new KierunkoweObszarowe
                {
                    ID = obszar.ID,
                    Symbol = obszar.Symbol,
                    Wybrany = kierunkoweObszarowe.Contains(obszar.ID)
                });
            }
            ViewBag.Courses = viewModel;
        }

        //
        // POST: /Efekt/Edit/5

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(int id , string[] selectedCourses)
        {
            Efekt efekt = db.Efekts.Find(id);

            if (ModelState.IsValid)
            {
                UpdateObszarowe(selectedCourses, efekt);

                db.Entry(efekt).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            EfektyObszarowe(efekt);
            return View(efekt);
        }

        private void UpdateObszarowe(string[] selectedCourses, Efekt instructorToUpdate)
        {
            if (selectedCourses == null)
            {
                instructorToUpdate.EfektyObszarowe = new List<Obszarowe>();
                return;
            }

            var selectedCoursesHS = new HashSet<string>(selectedCourses);
            var instructorCourses = new HashSet<int>
                (instructorToUpdate.EfektyObszarowe.Select(c => c.ID));
            //var temp = db.Efekts.Find(instructorToUpdate.ID);
           ///////// Obszarowe ob;

            foreach (var course in db.EfektyObszarowe)
            {
                if (selectedCoursesHS.Contains(course.ID.ToString()))
                {
                 if (!instructorCourses.Contains(course.ID))
                {
                     instructorToUpdate.EfektyObszarowe.Add(course);
                /*ob = db.EfektyObszarowe.Find(Int32.Parse(course));
                        instructorToUpdate.EfektyObszarowe.Add(ob);
                */

                    }
                }
                else
                {
                    if (instructorCourses.Contains(course.ID))
                    {
                        instructorToUpdate.EfektyObszarowe.Remove(course);
                    }   
                }
            }
        }

当我取消选中带有“Obszarowe”的复选框时没关系,从集合中删除项目并且我只看到选中的对象但是当我取消选中所有没有区别时:(对不起我的英语

【问题讨论】:

  • 您没有包含任何删除项目的方法。
  • 我只想删除关系。模型 Efekt 中列表 EfektyObszarowe 中的最后一项
  • 有点离题,但你应该避免用形容词命名类。 Obszarowe 是一个相当不幸的实体名称。

标签: c# .net asp.net-mvc entity-framework asp.net-mvc-4


【解决方案1】:

你确实...

instructorToUpdate.EfektyObszarowe = new List<Obszarowe>();

但是你通过...获取instructorToUpdate

Efekt efekt = db.Efekts.Find(id);

这意味着EfektyObszarowe 集合未加载,因此不会跟踪更改。所以你必须在获取Efekt时加载集合:

Efekt efekt = db.Efekts.Include(e => e.EfektyObszarowe).Single(e.ID == id);

【讨论】:

  • 它可以工作,但仅在 Chrome 上的 IE 上它不起作用。但是非常感谢:)
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2013-11-01
  • 2016-11-08
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多