Unable to track an entity of type 'x' because its primary key property 'xx' is null.

作者:outlela  来源:本站原创   发布时间:2024-5-21 10:49:35

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,属于一劳永逸了。

image.png

记录一下,因为全网都没有搜到解决方案……

*本文最后修改于:2024-5-21 11:7:51
本文标签: Unable to track an entity of type '' because its primary key property '' is null ef core efcore Microsoft.EntityFrameworkCore
本文由本站原创发布, 本文链接地址:https://outlela.com/share/193.html
转载或引用请保留地址并注明出处:outlela.com