我一直在.net 4.5网络项目中使用EF5 db一段时间,而且它运行良好。
我有一个查询在调用Count()或ToList()或Any()等时抛出空引用。
lastQuery = dbContext.Set<T>();
logger.Info("last Query: {0}", lastQuery); // this shows the correct query
lastQuery.ToList(); // only when the query is executed, null reference is thrown
lastQuery.ToString()显示正确的数据库查询。
此代码适用于指向uat / prod数据库的localhost,dev,qa和localhost。
实体框架5程序集(EntityFramework.dll 5.0.0.net45)包含在部署中并在本地引用。
只有在uat / prod服务器上运行此代码时才会中断。
我怀疑asp.net mvc 4不是最新的,所以我部署了一个独立的安装,但是没有解决它。
寻找关于如何解决问题的想法,或者prod等中可能缺少哪些组件。
调用堆栈:
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Data.EntityKey.ValidateTypeOfKeyValue(MetadataWorkspace workspace, EdmMember keyMember, Object keyValue, Boolean isArgumentException, String argumentName)
at System.Data.EntityKey.ValidateEntityKey(MetadataWorkspace workspace, EntitySet entitySet, Boolean isArgumentException, String argumentName)
at System.Data.Objects.ObjectStateManager.CheckKeyMatchesEntity(IEntityWrapper wrappedEntity, EntityKey entityKey, EntitySet entitySetForType, Boolean forAttach)
at System.Data.Objects.ObjectStateManager.AddEntry(IEntityWrapper wrappedObject, EntityKey passedKey, EntitySet entitySet, String argumentName, Boolean isAdded)
at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
答案 0 :(得分:2)
我想我明白了。
由于此视图首先使用db,因此必须定义主键。
在这种情况下,没有主键列,因此PK是几个字段的组合:
modelBuilder.Entity<V_MVC_USER_ACTION_PERMISSION>().HasKey(u => new { u.LOGIN_NAME, u.CONTROLLER_NAME, u.ACTION_NAME, u.APPLICATION_NAME });
并且在生产中,一堆记录以null action_name
返回这似乎是一个dbcontext no no,它将以空上下文异常跳闸。
作为临时解决方案,我在我的视图中添加了一个过滤器
其中Action_Name不为空
但是,找到一个更全面的解决方案会更好,其中所有这些行都将被忽略,而不是将整个返回值归零。