实体框架5数据库首先 - 仅在生产中使用null引用

时间:2014-02-24 18:58:49

标签: c# asp.net-mvc asp.net-mvc-4 entity-framework-5

我一直在.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)

1 个答案:

答案 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不为空

但是,找到一个更全面的解决方案会更好,其中所有这些行都将被忽略,而不是将整个返回值归零。