删除与基于视图的实体具有一对多关联的实体对象

Posted

技术标签:

【中文标题】删除与基于视图的实体具有一对多关联的实体对象【英文标题】:Deleting Entity Object with 1 to Many Association to View-Based Entity 【发布时间】:2016-08-15 10:30:04 【问题描述】:

我有一个 Model-First 实体模型,其中包含一个 Customer 表,该表链接到一个从单独的数据库中获取客户详细信息的视图。 Customer 表和 View 之间的关系是一对多的,并且我在 Customer 实体和 View 实体上都有一个导航属性。

当我尝试使用 context.Customers.DeleteObject(cust) 执行删除并调用 context.SaveChanges() 时出现错误:

无法更新 EntitySet 'ViewEntity',因为它有一个 DefiningQuery 并且不存在 [DeleteFunction] 元素来支持当前操作。


我尝试设置 On Delete Cascade 和 None 并且都产生相同的错误。

编辑:没有太多的代码可以展示,但是你去吧:

Customer selectedCust = (Customer)dgvCustomers.SelectedRows[0].DataBoundItem;
if (selectedCust != null)

    if (MessageBox.Show(String.Format("Are you sure you want to delete Customer 0?", selectedCust.CustomerID.ToString()), 
                            "Customer Delete Confirmation", MessageBoxButtons.YesNo) == DialogResult.Yes)
    
        // TODO - Fix this
        this.ReportSchedDBContext.Customers.DeleteObject(selectedCust);
        this.ReportSchedDBContext.SaveChanges();                      
    

【问题讨论】:

向我们展示你的代码兄弟 你的实体和表有主键吗? 基于真实表(客户)的实体会,基于视图的实体不会,因为它基于视图。 你试过用 Remove 代替 DeleteObject 吗?除此之外,如果不查看所涉及的上下文部分的代码,就很难知道发生了什么。 是自追踪实体吗?您通常应该遵循这样的模式,从数据库中检索实体,标记为删除并保存。 【参考方案1】:

SO 中的许多相关帖子都同意@Overmachine...您可能缺少实体/表上的主键。

看..

because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element

Unable to update the EntitySet - because it has a DefiningQuery and no <UpdateFunction> element exist


编辑

刚刚看到您关于您的 Customer 表具有主键但您的视图没有的评论。如果没有更多代码,不确定会发生什么,但最终您只需要一个带有主键的Customer 对象,然后您可以使用以下代码删除一个分离的实体对象。

this.ReportSchedDBContext.Entry(selectedCust).State = EntityState.Deleted;
this.ReportSchedDBContext.SaveChanges();  

如果您是从另一种类型转换并导致问题,您也可以这样做:

var cust = new Customer  CustomerID = selectedCust.CustomerID ;
this.ReportSchedDBContext.Entry(cust).State = EntityState.Deleted;
this.ReportSchedDBContext.SaveChanges();  

【讨论】:

嗨,克里斯,感谢您的帮助。我忘了澄清我使用的是旧版本的 EF (v4),所以您发布的大部分内容都不适用于我(例如 DBContext)。我尝试更新我的版本,但很多东西都坏了,我现在没有时间解决这个问题。【参考方案2】:

我能够通过创建一个不执行任何操作的虚拟存储过程(“SELECT 'Done'”)并在我的两个视图中使用 SP 函数映射将删除函数设置为此存储过程来解决此问题。相当黑客,但它的工作。

我不确定为什么视图需要删除功能,或者我是否做错了导致问题的其他错误,但上述方法对我有用。

【讨论】:

【参考方案3】:

我认为您应该在 View 中使用所有外键。当您在视图中使用所有外键和主键时,您可以更新和删除对象作为级联。

【讨论】:

感谢您的回复,但我并没有想要删除视图中的任何内容。事实上,我禁用了 Delete Cascade,但我仍然遇到同样的错误。我必须基本上定义一个带有存储过程的虚拟删除函数,该存储过程什么都不做,并将删除链接到视图以使逻辑正常工作。

以上是关于删除与基于视图的实体具有一对多关联的实体对象的主要内容,如果未能解决你的问题,请参考以下文章

iOS:删除核心数据中具有一对多关系的实体

如何基于另一个实体的一对多关系访问 CoreData 实体?

Asp.net 如何使用实体框架删除一对多的对象

4.一对多关联映射

核心数据:删除最后一个具有一对多关系的实体

CoreData不删除对象一对多实体