欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

EFcore 报错:Value cannot be null. Parameter name: frameworkName

程序员文章站 2022-04-21 15:39:45
...

今天在EF core 2.2 中使用code first 保存数据时遇到一个错误:

Value cannot be null.

Parameter name: frameworkName

   at Microsoft.EntityFrameworkCore.Metadata.Internal.ClrCollectionAccessorFactory.Create(INavigation navigation)

   at Microsoft.EntityFrameworkCore.Metadata.Internal.Navigation.<>c.<get_CollectionAccessor>b__21_0(Navigation n)

   at Microsoft.EntityFrameworkCore.Internal.NonCapturingLazyInitializer.EnsureInitialized[TParam,TValue](TValue& target, TParam param, Func`2 valueFactory)

   at Microsoft.EntityFrameworkCore.Metadata.Internal.Navigation.get_CollectionAccessor()

   at Microsoft.EntityFrameworkCore.NavigationExtensions.GetCollectionAccessor(INavigation navigation)

   at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.CustomShaperCompilingExpressionVisitor.VisitExtension(Expression extensionExpression)

   at System.Linq.Expressions.Expression.Accept(ExpressionVisitor visitor)

 

看到错误说时和collection有关, 

 

代码中的是这样定义的

private readonly List<SharedDataItem> _sharedData = new List<SharedDataItem>();

        public IEnumerable<SharedDataItem> SharedData => _sharedData.AsReadOnly();

当时第一反应是一对多的关系 映射有问题, 然后检查了entityconfiguration类以及add-migration / update-database步骤是否正常, 发现一切ok, 最终的数据库表结构也没问题。

 

后来又想了下,是不是因为我私有字段的缘故, 然后在entityconfiguration类中添加了下面的代码       

builder.HasMany(p => p.SharedData).WithOne().HasForeignKey("WorkOrderId");

            var navigation = builder.Metadata.FindNavigation(nameof(WorkOrder.SharedData));

            navigation.SetPropertyAccessMode(PropertyAccessMode.Field);

结果还是有问题, 允悲。。。。

 

 

后来看到一个github的帖子: https://github.com/dotnet/efcore/issues/19535 才找到了原因:

是我的私有字段定义readonly了。 删除即可。

最终的定义是:

private readonly List<SharedDataItem> _sharedData = new List<SharedDataItem>();

        public IEnumerable<SharedDataItem> SharedData => _sharedData.AsReadOnly();

再次运行各种save操作都ok了。 因为这个还导致了我的电脑各种蓝屏。