请考虑以下关系:
Car(entity)1 ----------------------> *车轮(实体)
Wheel(entity)1 ---------> 1 Nut(复杂类型)
Wheel(entity)1 ---------> 1 Rim(复杂类型)
Nut和Rim复杂类型都映射到名为Nuts和Rims的表。我使用Wheel ID作为Nuts和Rims主键。
现在,当尝试使用代码删除Car时,我得到以下异常:
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",table" dbo.Nuts",column' Id'。
鉴于,复杂类型是实体的必需参数并且具有一对一的关系,为什么在这种情况下默认不会将级联删除设置为ON? 其次,应该如何删除CAR及其相关的许多车轮以及所有相关的螺母和轮辋。 最后,就我而言,一辆汽车有数千个轮子。在代码或使用存储过程中这是一个好主意吗?
感谢。
答案 0 :(得分:0)
正如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,那么将在数据库中完成级联删除,这应该很快。如果您想分别删除汽车的许多车轮,请查看Entity Framework Extensions:http://efe.codeplex.com/