实体框架DbContext删除子对象

时间:2014-06-10 21:53:39

标签: c# entity-framework-5 dbcontext

我试图删除foreach循环中的子对象,但这似乎不起作用..这就是我所拥有的。 我有一个会议和meeting_category实体,它们具有一对多的关系..

    foreach (meeting_category meetingCategory in currentMeeting.meeting_category)
            {
              dbContext.meeting_category.Remove(meetingCategory);
              dbContext.Entry(meetingCategory).State = EntityState.Deleted;
              dbContext.SaveChanges();
            }

然后我返回相同的视图并更新结果..这似乎非常不一致。有时它删除实体,有时则不删除实体。即使删除它,我的会议对象仍然有我删除的meeting_category对象。

如果不从DB中删除,它会更新会议对象并从会议中删除meeting_category对象。 是否有任何类型的重置或刷新,以便会议对象删除meeting_category对象。 如何确保它始终从DB和会议对象中删除meeting_category对象,当我返回到视图时,我有一个更新的会议对象?

这是我的会议实体

    public partial class meeting
    {
        public meeting()
        {
            this.meeting_questions = new HashSet<meeting_questions>();
            this.meeting_abstract = new HashSet<meeting_abstract>();
            this.meeting_category = new HashSet<meeting_category>();
            this.meeting_image = new HashSet<meeting_image>();
        }

        public int meeting_id { get; set; }
        public int language_id { get; set; }
        public string meeting_code { get; set; }
        public string meeting_name { get; set; }
        public string meeting_description { get; set; }
        public System.DateTime meeting_start_date { get; set; }
        public System.DateTime meeting_end_date { get; set; }
        public System.DateTime abstract_cutoff_date { get; set; }
        public string meeting_guidelines { get; set; }
        public string created_by { get; set; }
        public Nullable<System.DateTime> created_datetime { get; set; }
        public Nullable<bool> meeting_published { get; set; }
        public Nullable<bool> meeting_deleted { get; set; }
        public Nullable<bool> meeting_fully_created { get; set; }

        public virtual language language { get; set; }
        public virtual ICollection<meeting_questions> meeting_questions { get; set; }
        public virtual ICollection<meeting_abstract> meeting_abstract { get; set; }
        public virtual ICollection<meeting_category> meeting_category { get; set; }
        public virtual ICollection<meeting_image> meeting_image { get; set; }
    }

这是我的meeting_category实体

 public partial class meeting_category
    {
        public meeting_category()
        {
            this.abstract_category = new HashSet<abstract_category>();
        }

        public int meeting_category_id { get; set; }
        public int meeting_id { get; set; }
        public int category_type_id { get; set; }
        public int category_id { get; set; }
        public string category_name { get; set; }
        public string category_name_en { get; set; }

        public virtual ICollection<abstract_category> abstract_category { get; set; }
        public virtual category category { get; set; }
        public virtual category_type category_type { get; set; }
        public virtual meeting meeting { get; set; }
    }

2 个答案:

答案 0 :(得分:0)

关于你想要实现的目标,我有几个问题。

首先你确定会议 - &gt;类别关系是多对一的?我通常希望它是多对多的,即每个会议可以有很多类别,每个类别可以附加到许多会议。

其次,您实际上是在尝试删除类别,还是在尝试从会议中删除类别?

如果您只是想删除会议和类别之间的关系,则需要编辑导航属性,即MyMeeting.Categories.Remove(MyCategory)。

如果您要删除实际的类别,则需要确保该类别当前未链接到任何会议,否则如果您尝试删除类别,则会收到外键违规。

除此之外,您可能会遇到chaching或仅仅是对象生命周期管理问题。

您创建了哪种类型的应用程序? ASP.NET?的WinForms?等

您如何实际实例化DBContext的具体版本?你在使用DI吗?

干杯迈克

答案 1 :(得分:0)

我设法通过在加载视图之前创建每个控制器动作的DbContext并销毁它来解决问题。 问题是我在另一个类中创建DbContext并在所有控制器操作上重用相同的上下文。由于实体被缓存在dbcontext中,我总是得到实体的旧缓存副本,并且工作非常不一致。

相关问题