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了。 因为这个还导致了我的电脑各种蓝屏。