【问题标题】:Entity Framework DbContext Delete child object实体框架 DbContext 删除子对象
【发布时间】:2014-06-15 04:25:24
【问题描述】:

我正在尝试删除 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 对象。

当它不从数据库中删除时,它会更新会议对象并从会议中删除 meeting_category 对象。 为了让会议对象删除 meeting_category 对象,我是否需要进行任何类型的重置或刷新。 如何确保它始终从数据库和会议对象中删除 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; }
    }

【问题讨论】:

  • 你在哪里创建上下文?你的实体来自哪里?了解您在上下文中所做的事情以及您的实体是依附于它还是分离是至关重要的。也有必要知道你如何阅读你的实体。上下文可以缓存实体,如果使用不当,可能会导致问题。请在 ypur 问题中添加更多信息
  • 嗨 JotaBe,我的 DBContext 是使用 Visual Studio 中的实体模型生成器创建的。我们在 DbContext 中使用 SQL 服务器实体。我们的实体是附属实体。我认为实体的上下文缓存似乎是一个问题。你能指导我吗?如果您需要任何其他信息,请告诉我

标签: c# entity-framework-5 dbcontext


【解决方案1】:

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

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

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

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

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

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

您正在创建什么类型的应用程序? ASP.NET?表格?等等

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

迈克干杯

【讨论】:

  • Mike, Meeting -> 类别具有一对多的关系。一个会议可以有多个 meeting_category 对象。我实际上是在尝试删除会议类别。实际上,我想要完成的是我有一个 meeting_category 选择页面,他们可以在其中为一个特定的会议选择多个类别。添加 meeting_category 对会议工作正常。当他们想要编辑这些类别时,他们可以再次选中/取消选中所需的类别并提交页面。当他们发布它时,我正在尝试删除旧的,这就是它导致问题的地方。
  • @AndyJohnson 这将使关系成为多对多关系,因为我很确定可以举行具有相同类别的不同会议。对吗?
  • 否..我有一个单独的类别表来显示类别选择。对于每次会议,我对每个类别都有单独的行。因此,对于另一个会议,我可以选择相同的类别,但会在不同的行中,且 meeting_id 和 meeting_category_id 不同。如果您需要进一步澄清,请告诉我。我迫切需要帮助。
  • 你所说的一切仍然让我相信这是一个多对多的关系。您能否发布这两个实体的实际实体定义以确保。您还应该发现在 EF 创建的数据库中有一个链接表。这实际上并不重要,因为如果您尝试删除某个类别(如果该类别已在任一场景中使用),您将收到外键违规错误。您能否回答所有其他问题,然后测试外键问题?即,如果该类别未使用,它是否可以正常工作?
  • 下面这行代码还有什么作用? dbContext.Entry(meetingCategory).State = EntityState.Deleted;我很确定它是不需要的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多