删除时级联-映射到表的复杂类型

本文关键字:复杂 类型 映射 级联 删除 | 更新日期: 2023-09-27 18:26:57

请考虑以下关系:

汽车(实体)1------------------->*车轮(实体)

车轮(实体)1-------->1螺母(复杂型)

车轮(实体)1-------->1轮辋(复杂型)

螺母和轮辋复杂类型都映射到名为"螺母"answers"轮辋"的表中。我使用车轮ID作为螺母和轮辋主键。

现在,当尝试使用代码删除汽车时,我得到以下异常:

System.InvalidOperationException: The operation failed: The relationship could not be changed   because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
at System.Data.Entity.Core.Objects.ObjectContext.PrepareToSaveChanges(SaveOptions options)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean  executeInExistingTransaction)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()

当尝试在MS-SSMS中执行此操作时,我收到以下错误:DELETE语句与REFERENCE约束"FK_dbo.Nuts_dbo.Wheel_Id"冲突。冲突发生在数据库"DatabaseName"、表"dbo.Nuts"、列"Id"中。

既然复杂类型是实体的必需参数,并且具有一对一的关系,为什么在这种情况下级联删除不默认为ON?其次,应该如何删除CAR及其相关的许多车轮以及所有相关的螺母和轮辋。最后,就我而言,一辆汽车有成千上万个轮子。在代码中这样做还是使用存储过程是个好主意?

谢谢。

删除时级联-映射到表的复杂类型

正如Ben Robinson在他的评论中提到的,用[ComplexType]属性化的类的目的是将它们的属性映射到包含类型的表中的列。不应有螺母或轮辋表。如果这不是想要的行为,那么它们就不应该是复杂的类型。

让我们假设它们不应该是复杂的类型,并找出它们为什么不级联删除。专注于Nut,假设你没有使用流畅的配置,我怀疑你需要有一个导航属性到Wheel on the Nut,以及WheelId。我想WheelId会用[Key]和[ForeignKey(Wheel)]标记。重点是导航属性。

使用流畅的配置,您将具有Wheel的导航属性,然后在Wheel的配置中,您将拥有:

HasRequired(wheel => wheel.Nut)
  .WithRequiredDependent(nut => nut.Wheel);

另一点需要注意的是,如果级联删除不是根据您的喜好生成的,则可以在外键创建的迁移中通过方法参数进行修改。

最后,回答你关于批量删除的问题:如果你删除了Car,它会级联删除Wheel,那么会在数据库中进行级联删除,而且应该很快。如果您想单独删除汽车的多个车轮,请查看实体框架扩展:http://efe.codeplex.com/