【问题标题】:Entity Framework Split Table Delete实体框架拆分表删除
【发布时间】:2011-11-17 16:46:26
【问题描述】:

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

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

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

我看到了 similar post,但我似乎无法使其与 STE 和 ApplyChanges 扩展方法一起使用。

现在我的数据访问代码很简单:我调用上下文的ApplyChanges(),然后是SaveChanges()

我尝试了一个简单的删除 SQL 函数并将其映射到两个实体,并且确实有效;但是它破坏了插入物。我似乎无法将所有属性的插入函数映射到两个实体。

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

欢迎任何建议。

谢谢!

【问题讨论】:

    标签: c# sql entity-framework entity-framework-4 self-tracking-entities


    【解决方案1】:

    解决方案类似于链接问题,但您必须使用 STE 的特定功能 - 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();
    

    【讨论】:

    • 非常感谢您的回复!效果很好!
    • 这让我深感困惑:为什么 EF 无法弄清楚,既然实体存储在同一张表中,删除其中一个也会删除另一个?为什么需要加载它?
    • @FyodorSoikin:我猜是因为还没有人实现这个功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多