删除数据库中可能存在也可能不存在的实体框架对象
本文关键字:不存在 实体 框架 对象 也可能 存在 数据库 删除 | 更新日期: 2023-09-27 18:15:56
我首先使用实体框架6,数据库(我是EF的新手)。我有两个实体类,Structure
和Contour
,其中Structure
可能包含多个类型为Contour
的对象。我希望能够删除Contours
是否已经存在于数据库中。例如,如果我像这样向现有的Structure
对象添加一个新的Contour
:
Contour contour = new Contour
{
Structure = structure,
};
我可以这样删除它:
contour.Structure = null;
但是如果轮廓已经在数据库中存在并且我删除了它,保存实体上下文会抛出异常"不能更改关系,因为一个或多个外键属性是不可空的……"
那个异常告诉我实体上下文不知道它应该删除那个Contour
。我的修复是删除Contour
如下:
contour.Structure = null;
EntityContext.Contours.Remove(contour);
但是如果轮廓已经不存在于数据库中(因为它刚刚被添加),那么实体上下文不知道它,它不会在其Contours
列表中找到它。然后我修改了我的delete方法:
contour.Structure = null;
if (EntityContext.Contours.Local.Contains(contour))
{
EntityContext.Contours.Remove(contour);
}
这似乎工作到目前为止,但这是我应该如何删除实体对象,可能或可能不已经存在于数据库中?
不要让它太复杂,你可以通过简单的调用context.Contours.Remove(contour)
来删除contour
。它不关心contour
是否已经在数据库中。例如:
using (var context = new EntityContext())
{
Vendor vendor = new Vendor();
context.Vendors.Add(vendor);
context.Vendors.Remove(vendor);
context.SaveChanges();
}
两个选项:
dbContext.Contours.Remove( contour );
或
structureInstance.Contours.Remove( contour ); // but this will load all of a structure's contours if not loaded already