删除与基于视图的实体的1对多关联的实体对象

时间:2016-04-22 00:53:09

标签: c# .net entity-framework entity-framework-4

我有一个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();                      
    }
}

3 个答案:

答案 0 :(得分: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对象,其上设置了主键,然后您可以使用以下代码删除分离的实体对象。 / p>

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();  

答案 1 :(得分:1)

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

我不确定为什么视图需要删除功能,或者我做错其他导致问题的原因,但上面的内容对我有用。

答案 2 :(得分:0)

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