我遇到了一个问题,这超出了我试图弄清楚的范围,我不确定这是 Visual Studio 的一些故障,还是我的 SQL Server 数据库有问题。我最初以为我只是在我创建的 WebAPI 中破坏了我的代码,因此我对SO提出了问题。但在进一步评估时,它可能是更多的东西。
这个问题甚至发生在从模板创建一个带有单独身份验证的新 ASP.Net Core WebAPI 时,只添加两个类,并搭建控制器和视图,我只能查询一个表,同时能够保存到所有表. 这是因为我的模型类数据来自一个数据库,而 AspNetUser 表位于另一个数据库中,而所有这些数据都在同一台 SQL Server 服务器上。
作为参考,任何时候为我的 Order 模型类调用控制器的 Index/Detail/Edit 时,它都会给出“NullReferenceException:对象引用未设置为对象的实例”。在浏览器中
await _context.Order.ToListAsync());
然而,我可以键入 /Order/Create 以进入 Order 的 Create 视图并让它更新数据库。虽然我的 Company 模型类允许查找、更新和插入数据库;两者都运行相同的 DBContext 连接。
这个问题出现在我遇到并搁置解决的另一个问题之后,我注意到的另一个问题是当我“注册”一个新用户时一切正常但是当我注销并尝试重新登录时总是失败。我想这可能与字段上 nvarchar 的大小不正确有关;但是我已经查找了最新的设置并且在那里似乎还不错,因为我想我可能会截断一些价值。我没有将这两个问题联系在一起的一个原因是因为第一个用户登录没有在浏览器中抛出任何错误代码(当然 Identity.EntityFramework 可能已经有一些幕后错误检查)来小心那个。但是由于用户在注册和注销后无法重新登录,这告诉我查询失败,即使它来自单独的连接。无论我尝试创建一个新程序多少次,这都会失败。
更新:我更改了 connectionString 以包含 MARS
“数据源={ServerName}\{InstanceName};初始目录={DatabaseName};集成安全性=True;连接超时=15;MultipleActiveResultSets=true;”
对于我的 userLogin 数据库和我的 appDatabase。这允许我重新登录用户。但是,它并没有让我查询 Order 表。因此,我尝试了一个新类 State(作为美国所有州的名称/代码),然后搭建了控制器和视图。该查询现在适用于 Company 和 State,但不适用于 Order。所以我认为它与 DBSets 的 DataMineDbContext 中的虚拟关键字有关,因为 State 没有在其中构建它。但这并没有解决我的问题。因此,尽管这是一个命名约定问题,但我在应用程序和我的数据库中都将 Order to Purchase 重命名为 Purchase。这没有帮助。
根据 BrownStone 先生的评论,从订单(现在是采购)控制器的 _context 获得的信息
H结果:-2147467261
InsideExpression:_COMPlusExceptionCode:-532462766 s_EDILock:{object}
消息:“对象引用未设置到对象的实例。”
资料来源:“匿名托管的 DynamicMethods 程序集”
StackTrace:“在 lambda_method(Closure,ValueBuffer)\r\n 在 Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.UnbufferedEntityShaper`1.Shape(QueryContext queryContext,ValueBuffer valueBuffer)\r\n 在 Microsoft.EntityFrameworkCore.Query.QueryMethodProvider。 _ShapedQuery>d__`1.MoveNext()\r\n 在 Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider._TrackEntities>d__15`2.MoveNext()\r\n 在 Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor` 1.EnumeratorExceptionInterceptor.MoveNext()\r\n 在 System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 来源,Int32& 长度)\r\n 在 System.Collections.Generic.EnumerableHelpers.ToArray[T] (IEnumerable`1 源)\r\n 在 System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 源)\r\n 在 System.Linq。SystemCore_EnumerableDebugView`1.get_Items()"
从查看您发布的堆栈跟踪来看,当 Entity Framework 尝试将结果从查询转换为您的模型实例时,似乎会引发错误。通常,当模型绑定出现问题时会引发您遇到的错误 - 在您的情况下,您的属性接受空值的能力。确保您的模型属性在能够接受空值方面与表列匹配。