使用ef core配置自引用关系注意事项
最近在学ef core,发现老师讲的和实际我做的有点出入。。。。也不知道是框架的BUG还是我编码的问题,暂且做个记录吧。。
1、首先遇到的第一个坑就是定义完自引用,迁移表的时候会报错,说是循环引用什么的,这块老师演示就没问题,我照着打的就有问题。。。。上网看别人的代码解决,关系最后加如下配置解决:
.OnDelete(DeleteBehavior.Restrict);
2、加完后表建好了,插入数据又出问题了,提示外键冲突,仔细查了一下,好像生成的外键列是默认不允许为null的,于是想当然的加了个配置
.IsRequired(false).OnDelete(DeleteBehavior.Restrict);
迁移后,根本就没有生成代码,代表EF不认为你的代码对数据结构有改变。。。。。。。。于是我又在下面手动的显示加配置
builder.Property(a=>a.ExpParentId).IsRequired(false);
结果迁移生成代码时抛异常。。。。。。。。。
最后的解决方法是在实体中显示定义外键,当然配置的时候也要显示配置外键,然后在实体中把外键的类型设置为可空类型,那么在生成的时候,ef就会自动把外键设置成可空了,然后插入数据就一切正常了
猜测原因:看老师的演示,他的ef如果不显式设置默认的是可空,而我的ef如果不显式设置,默认的是不可空,怀疑是EF Core的某个版本的这个默认值得更改,导致的这一系列的自引用关系的配置出问题,不知道是不是这样,现在暂时只能这么解决了