我正在使用实体框架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.
答案 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”的问题,但如果你遇到困难,这是一个相当可行的解决方案(并且也很容易实现)。欢呼声。