使用 Telerik OpenAccess ORM 我有2个对象User
和Investment
。更具体地说,Investments
包含User
的外键,作为任何典型的一对多关系。换句话说,每个用户可以拥有多个投资,但每个投资只能有一个用户。
然后我尝试使用开放访问功能“管理”
这应该意味着我可以做User.Investments.Clear();
这样的事情,它会删除所有相关的投资(或者至少在多对多关系中这样做)但不幸的是,当我尝试这个时,我受到了欢迎跟随错误。
"更新失败:Telerik.OpenAccess.RT.sql.SQLException:无法插入 列值为“UserID'”表中的值为NULL ' CODECorp.dbo.Investment&#39 ;;列不允许空值。 UPDATE 失败"
显然,ORM尝试做的是从投资对象中删除关联(即外键)而不是删除它。我已经通过运行SQL事件探查器确认了这一点,并且可以看到它正在运行Update
而不是Delete
。
那我在这里错过了什么?为什么它不正确地尝试删除关联而不是简单地删除行如您所期望的那样?
答案 0 :(得分:4)
根据设计,在从父对象的集合中删除子对象的情况下,IsManaged的导航属性的行为设置为True,即删除两个对象之间的关系。换句话说,Telerik数据访问(以前称为Telerik OpenAccess ORM)将子记录保留在数据库中,但会生成一个尝试将外键设置为NULL的语句。
这种情况下的解决方案是将集合传递给上下文的Delete方法。例如:
dbContext.Delete(User.Investments);
dbContext.SaveChanges();
这将产生必要的DELETE语句。有关使用Telerik Data Access管理导航属性的更多详细信息,请参见this documentation article。
我希望你觉得这很可行。我期待着您的反馈。