我有一个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();
}
}
答案 0 :(得分:1)
SO中的许多相关帖子都同意@Overmachine ...您可能错过了实体/桌子上的主键。
请参阅..
和
修改强>
刚刚看到您对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中使用所有外键。当您在视图中使用所有外键和主键时,您可以更新和删除对象为级联。