小编典典

实体框架拆分表删除

sql

我正在使用EF 4 STE对附件对象进行建模。该 附件
包含了名称,描述,日期,以及最重要的数据(byte[])。为了优化加载,我不想在绝对必要之前(即当用户Download从客户端单击时)检索Data属性。

为了遵循这种方法,我使用了此处描述的表拆分技术。我将“ 附件” 表分为“ 附件”
(“名称”,“描述”,“日期”)和“ AttachmentData” (数据)。在我的EF模型中,这是一对一的关系。一切正常,直到我尝试删除没有
AttachmentData附件 (即attachment.AttachmentData == null)。我得到以下异常:

遇到无效的数据。缺少必需的关系。检查StateEntries以确定约束违例的来源。

现在,我的数据访问代码很简单:我称上下文为,ApplyChanges()后跟SaveChanges()

我已经尝试了一个简单的删除SQL函数,并将其映射到两个实体,并且确实有效。然而,它打破了插入。我似乎无法将所有属性的插入功能映射到两个实体。

我可以尝试其他一些选择吗?Attachment和AttachmentData之间的关系可以是可选的吗?当我将其设为1到0+时,我得到一个映射错误,说Their primary keys may collide

公开接受任何建议。

谢谢!


阅读 162

收藏
2021-05-05

共1个答案

小编典典

解决方案类似于链接的问题,但是您必须使用STEs的特定功能- ApplyChanges

context.Attachments.ApplyChanges(att);
if (context.ObjectStateManager.GetObjectStateEntry(att).State == EntityState.Deleted)
{
    var data = new AttachmentData() {Id = att.Id};
    context.AttachmentDataSet.Attach(data);
    context.AttachmentDataSet.DeleteObject(data);
}
context.SaveChanges();
2021-05-05