删除数据库中可能已存在或可能尚未存在的实体框架对象

时间:2015-10-02 15:32:05

标签: c# entity-framework entity-framework-6

我首先使用Entity Framework 6,数据库(我是EF的新手)。我有两个实体类StructureContour,其中Structure可能包含多个Contour类型的对象。我希望能够删除Contours,无论它们是否已存在于数据库中。例如,如果我向现有Contour对象添加新的Structure,请执行以下操作:

Contour contour = new Contour
{
    Structure = structure,
};

我可以删除它:

contour.Structure = null;

但是如果轮廓已经存在于数据库中并且我将其删除,则保存实体上下文会抛出异常"由于一个或多个外键属性不可为空,因此无法更改关系。 "

该异常告诉我,实体上下文并未意识到它应该删除Contour。我的修复是删除Contour,如下所示:

contour.Structure = null;
EntityContext.Contours.Remove(contour);

但是如果数据库中的轮廓已经不存在(因为它刚刚被添加),那么实体上下文就不会知道它并且它在Contours中找不到它。名单。所以我将删除方法修改为:

contour.Structure = null;
if (EntityContext.Contours.Local.Contains(contour))
{
    EntityContext.Contours.Remove(contour);
}

这似乎到目前为止有效,但这是我应该如何删除数据库中可能已存在或可能不存在的实体对象?

2 个答案:

答案 0 :(得分:-1)

不要太复杂,您可以通过简单的电话contour删除context.Contours.Remove(contour)。它并不关心contour已经存在于数据库中。例如:

using (var context = new EntityContext())
{
    Vendor vendor = new Vendor();
    context.Vendors.Add(vendor);
    context.Vendors.Remove(vendor);
    context.SaveChanges();
}

答案 1 :(得分:-1)

两个选项:

dbContext.Contours.Remove( contour );

structureInstance.Contours.Remove( contour ); // but this will load all of a structure's contours if not loaded already