3

使用Telerik OpenAccess ORM我有 2 个对象UserInvestment. 更具体地说,包含与任何典型的一对多关系一样Investments的外键。User换句话说,每个用户可以有多个投资,但每个投资只能有一个用户。

然后,我尝试利用开放访问功能“受管理”

在此处输入图像描述

这应该意味着我可以做类似的事情User.Investments.Clear();,它会删除所有相关的投资(或者至少这在多对多关系中可以正常工作)但不幸的是,当我尝试这样做时,我遇到了以下错误。

“更新失败:Telerik.OpenAccess.RT.sql.SQLException:无法将值 NULL 插入 'UserID' 列,表 'CODECorp.dbo.Investment';列不允许空值。更新失败。”

很明显,ORM 试图做的是将投资对象与用户的关联(即外键)删除,而不是删除它。我已经通过运行 SQL 探查器确认了这一点,并且可以看到它正在运行Update而不是Delete.

那么我在这里错过了什么?为什么它错误地尝试删除关联,而不是像您期望的那样简单地删除行?

4

1 回答 1

4

按照设计,在将 IsManaged 设置为 True 的情况下,在从父对象的集合中删除子对象的情况下,导航属性的行为是删除两个对象之间的关系。换句话说,Telerik Data Access(以前称为 Telerik OpenAccess ORM)会将子记录保留在数据库中,但会生成一条尝试将外键设置为 NULL 的语句。

这种情况下的解决方案是将集合传递给上下文的 Delete 方法。例如:

dbContext.Delete(User.Investments);
dbContext.SaveChanges();

这将产生必要的 DELETE 语句。此文档文章中提供了有关使用 Telerik Data Access 管理导航属性的更多详细信息。

我希望你觉得这是可行的。我期待着您的反馈。

于 2014-02-05T12:34:14.170 回答