EF CORE 报错:Unable to track an entity of type '' because its primary key property '' is null.
EF CORE 版本:Microsoft.EntityFrameworkCore 6.0.15
关联:EFCORE新增和更新时忽略导航属性验证
报错原因:实体添加了导航属性,在新增与修改时候,会同时校验导航属性,并同步进行新增与修改操作。
对于这个报错,我是很怀疑Microsoft .EntityFrameworkCore的机制的,为什么会这样验证??
好了,不废话,如何解决:
①、在新增或者修改的时候,把导航属性赋值为null即可,这很简单,但是有的时候记不到赋值,就会报错,还不一定记得起来,就相当尴尬……
②、在Context类方法OnModelCreating中使用Ignore方法:
modelBuilder.Entity<Blog>().Ignore(b => b.Posts);
③、使用HasNoKey方法:
modelBuilder.Entity<Blog>().HasNoKey();
④、使用HasNoNavigation方法:
modelBuilder.Entity<Blog>().HasNoNavigation(b => b.Posts);
⑤、使用HasNoRelationship方法:
modelBuilder.Entity<Blog>().HasNoRelationship(b => b.Posts);
⑥、方法封装
private void MakeIgnore<T>(T model) { var entry = _context.Entry(model); foreach (var entryNavigation in entry.Navigations) { entryNavigation.CurrentValue = null; } }
因为当前项目是用Scaffold-DbContext命令生成的Context和实体类,而且数据库并设置没有外键,所以修改Context里面的内容不太科学也不太现实,最终封装了个统一方法,把所有导航属性都赋值为NULL,属于一劳永逸了。
记录一下,因为全网都没有搜到解决方案……