实体框架DbContext删除子对象
本文关键字:对象 删除 DbContext 框架 实体 | 更新日期: 2023-09-27 18:07:57
我试图删除foreach循环中的子对象,但这似乎不工作。这是我有的。我有一个meeting和一个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对象。我怎样才能确保它始终如一地从数据库和会议对象中删除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; }
}
我有几个问题,关于你想要达到的目标。
首先,您确定会议->类别关系是多对一吗?我通常希望它是多对多的,即每个会议可以有许多类别,每个类别可以附加到许多会议。
其次,您实际上是在尝试删除类别还是在尝试从会议中删除类别?
如果你只是想删除会议和类别之间的关系,那么你需要编辑导航属性,即MyMeeting.Categories.Remove(MyCategory)。
如果您试图删除实际的类别,那么您需要确保该类别当前没有链接到任何会议,否则如果您试图删除该类别,将会得到外键违规。
在所有这些之上,您可能会遇到缓存或简单的对象生命周期管理问题。
你在创建什么类型的应用程序?ASP.NET ?WinForms吗?等。
如何实例化DBContext的具体版本?您是否使用DI?
欢呼迈克
我设法通过为每个控制器操作创建DbContext并在加载视图之前销毁它来解决这个问题。问题是我在另一个类中创建DbContext,并且在所有控制器动作上重用相同的上下文。由于实体是在dbcontext中缓存的,所以我总是得到实体的旧缓存副本,并且工作非常不一致。