实体框架6 Casscading Deletes和DropForeignKey在自动生成的约束名称上失败
我一直遇到Entity Framework的一个问题,并且在几个一对多关系中的两个表之间级联删除。
最初看起来正确的路径是使用OnModelCreating
DbContext
方法配置表映射,以{/ 1>}的方式关闭级联删除
modelBuilder.Entity<SourceTable>()
.HasOptional(x => x.NavigationProperty)
.WithOptionalDependent()
.WillCascadeOnDelete(false);
然而这不会引起异常陈述
无法删除或更新父行:外键约束失败...
更多的研究让我相信这是因为所有受影响的实体都必须加载到上下文中(eager fetched),以便实体框架可以将FK引用设置为null作为事务的一部分。根据我要处理的关系图的大小,这对我的需求是不实际的。
我的下一个方法是修改Seed
类的Configuration
方法并运行一些任意SQL来删除外键约束并将其重新添加为ON DELETE SET NULL constaint。这在大多数情况下都有效,但其中一个限制似乎是一个自动生成的不可预测的名称,在每次调用Update-Database
时都是不同的。鉴于该名称无法预测,ALTER的声明并非特别有帮助
context.Database.ExecuteSqlCommand(@"ALTER TABLE SourceTable DROP FOREIGN KEY FK_9405957d032142c3a1227821a9ed1fdf;
ALTER TABLE SourceTable
ADD CONSTRAINT FK_ReasonableName
FOREIGN KEY (NavigationProperty_Id) REFERENCES NavigationProperty (Id) ON DELETE SET NULL;");
最后,我采用了apprach来使用迁移功能(DbMigration
)并覆盖Up
方法,并利用DropForeignKey
方法和更明确的SQL来重新添加约束(EF似乎不提供创建ON DELETE SET NULL约束的功能)。
DropForeignKey("SourceTable", "NavigationProperty_Id", "DestinationTable");
Sql("ALTER TABLE SourceTable ADD CONSTRAINT FK_ReasonableName FOREIGN KEY (NavigationProperty_Id) REFERENCES DestinationTable (Id) ON DELETE SET NULL;");
这很有效,直到我遇到自动生成名称的约束。此时,DropForeignKey
方法失败,异常被
System.Runtime.Serialization.SerializationException:成员'MySql.Data.MySqlClient.MySqlException,MySql.Data ...
的类型未解析
将迁移转储到SQL脚本文件时,很明显DropForeignKey
只生成一个带有更可预测,非模糊的字节流数组的FK。
是否有正确的EF Code First方法来解决在删除refrenced行时将FK列值设置为null
的问题,或者我为了获得此功能而不得不手动编写SQL?