删除数据库中可能存在也可能不存在的实体框架对象

本文关键字:不存在 实体 框架 对象 也可能 存在 数据库 删除 | 更新日期: 2023-09-27 18:15:56

我首先使用实体框架6,数据库(我是EF的新手)。我有两个实体类,StructureContour,其中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