删除EF4中的实体而不加载整个实体

时间:2011-04-08 13:31:30

标签: mysql entity-framework-4

我正在使用实体框架4并且具有以下设置和问题。

我在MySql中有一个表,元数据字段是一个blob字段。使用描述here的表拆分技术,我将表分为两个实体(DataItem和DataItemDetails)。这样我就可以在不加载blob的情况下加载所有元数据。

问题是,当我尝试删除dataitem实体时,我得到了这个例外:

  

异常:   System.Data.UpdateException:无效   遇到的数据。一个必需的   关系缺失。检查   StateEntries确定源   约束违规。

如果我转向Lazy Loading或加载DataItemDetail部分,我可以删除DataItem。

这没关系,但我不想加载数据只是为了删除它。

if (!D.DataItemDetailReference.IsLoaded)
     D.DataItemDetailReference.Load();
_db.DataItems.DeleteObject(d);
_db.SaveChanges();


_db is the ObjectContext dereived class and D is an instance of the DataItem class.

3 个答案:

答案 0 :(得分:6)

如果您不想加载该属性,则必须欺骗EF,以便它认为已加载相关的DataItemDetail

var detailItem = new DataItemDetail { Id = d.Id }; 
_db.DataItemDetails.Attach(detailItem);
_db.DataItems.DeleteObject(d);
_db.SaveChanges();

这里的问题是表拆分使用1:1关系,EF知道如果它删除了关系的一端,它也应该删除另一端,但是因为你没有加载另一端,所以它不能这样做。 / p>

答案 1 :(得分:1)

感谢Ladislav和Markus!这正是我所需要的。要在带有Database First的Entity Framework 4.1中执行此操作,我必须在此进行更改:

If _db.Entry(d).Reference(Function(e) e.DataItemDetails).IsLoaded() = False Then
     Dim detailItem = New DataItemDetails With { .ID = d.ID }
     _db.DataItemDetails.Attach(detailItem)
End If
_db.DataItems.Remove(d)
_db.SaveChanges()

答案 2 :(得分:0)

你有什么理由不能调用存储过程吗? MEF应该处理那些没问题,你会好起来的。快速将ID传递给存储过程,您可以使用数据执行您喜欢的操作。

抱歉...编辑说,我知道这并没有回答“如何使用EF4”的问题,但如果你遇到困难,这是一个相当可行的解决方案(并且也很容易实现)。欢呼声。