2013-01-15 141 views
2

我一直有一段时间出现错误,并且在阅读所有其他帖子时,我没有得到更多的切肉刀。实体框架 - 索引(从零开始)必须大于或等于零

使数据库调用当我得到的错误:

Index (zero based) must be greater than or equal to zero 

我有以下的方法,它给我的错误:

public bool IsUserInRole(User user, string roleName) 
    { 
     using (var repository = new SaxoPublishingEntities()) 
     { 
      repository.Attach(user); 

      // THIS CALLS GIVE ME THE ERRROR 
      var roles = repository.UserRoles.Include("Users").Where(userRole => 
       userRole.Name == roleName && userRole.Users.Contains(user)).ToList(); 


      if (roles.Any()) 
      { 
       return true; 
      } 
      return false; 
     } 
    } 

我的数据库模型:

enter image description here

我的堆栈跟踪:

[FormatException: Indekset (nulbaseret) skal være større end eller lig med nul og mindre end størrelsen af argumentlisten.] 
    System.Text.StringBuilder.AppendFormat(IFormatProvider provider, String format, Object[] args) +10610374 
    System.String.Format(IFormatProvider provider, String format, Object[] args) +63 
    System.Data.EntityRes.GetString(String name, Object[] args) +363 
    System.Data.Entity.Strings.ELinq_UnsupportedConstant(Object p0) +95 
    System.Data.Objects.ELinq.ConstantTranslator.TypedTranslate(ExpressionConverter parent, ConstantExpression linq) +1256 
    System.Data.Objects.ELinq.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) +88 
    System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) +162 
    System.Data.Objects.ELinq.ContainsTranslator.TranslateContains(ExpressionConverter parent, Expression sourceExpression, Expression valueExpression) +136 
    System.Data.Objects.ELinq.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) +1011 
    System.Data.Objects.ELinq.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) +88 
    System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) +162 
    System.Data.Objects.ELinq.BinaryTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq) +122 
    System.Data.Objects.ELinq.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) +88 
    System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) +162 
    System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input) +168 
    System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding) +161 
    System.Data.Objects.ELinq.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda) +168 
    System.Data.Objects.ELinq.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) +66 
    System.Data.Objects.ELinq.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) +47 
    System.Data.Objects.ELinq.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) +169 
    System.Data.Objects.ELinq.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) +88 
    System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) +162 
    System.Data.Objects.ELinq.ExpressionConverter.TranslateSet(Expression linq) +53 
    System.Data.Objects.ELinq.UnarySequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) +197 
    System.Data.Objects.ELinq.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) +47 
    System.Data.Objects.ELinq.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) +169 
    System.Data.Objects.ELinq.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) +88 
    System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) +162 
    System.Data.Objects.ELinq.ExpressionConverter.Convert() +50 
    System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) +593 
    System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +255 
    System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +89 
    System.Linq.Enumerable.Single(IEnumerable`1 source) +100 
    System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3(IEnumerable`1 sequence) +31 
    System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable`1 query, Expression queryRoot) +56 
    System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) +97 
    System.Linq.Queryable.Any(IQueryable`1 source) +233 
    Saxo.Publishing.Business.UserServiceOLD.IsUserInRole(User user, String roleName) in c:\Users\laho\Documents\GitHub\SaxoPublishing\Development\Saxo Publishing\Saxo.Publishing.Business\UserServiceOLD.cs:175 
    Saxo.Publishing.Web.Security.UserPrincipal.IsInRole(String role) in c:\Users\laho\Documents\GitHub\SaxoPublishing\Development\Saxo Publishing\Saxo.Publishing.Web\Security\User\UserPrincipal.cs:42 
    System.Linq.Enumerable.Any(IEnumerable`1 source, Func`2 predicate) +146 
    System.Web.Mvc.AuthorizeAttribute.AuthorizeCore(HttpContextBase httpContext) +333 
    System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext) +421 
    System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor) +143 
    System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) +978 
    System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +161 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate`1 endDelegate, Object tag, Int32 timeout) +92 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate`1 endDelegate, Object tag) +53 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +538 
    System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) +83 
    System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +161 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate`1 endDelegate, Object tag, Int32 timeout) +92 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate endDelegate, Object tag, Int32 timeout) +97 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate endDelegate, Object tag) +53 
    System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +531 
    System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +161 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate`1 endDelegate, Object tag, Int32 timeout) +92 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate endDelegate, Object tag, Int32 timeout) +97 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate endDelegate, Object tag) +53 
    System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +447 
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +49 
    System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) +127 
    System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +161 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate`1 endDelegate, Object tag, Int32 timeout) +92 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate endDelegate, Object tag, Int32 timeout) +97 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate endDelegate, Object tag) +53 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +388 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +88 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +50 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

任何想法高度赞赏! :-)

试图重写版本1:

public bool IsUserInRole(User user, string roleName) 
    { 
     using (var repository = new SaxoPublishingEntities()) 
     { 

      var users = repository.Users.Where(c => c.Id == user.Id); 

      if (users.Any()) 
      { 
       var myUser = users.First(); 
       var roles = repository.UserRoles.Where(userRole => 
        userRole.Name == roleName && userRole.Users.Contains(myUser)).ToList(); 

       if (roles.Any()) 
       { 
        return true; 
       } 
      } 
      return false; 
     } 
    } 
+0

尝试搜索'UserID',而不是安装在'User'和使用'userRole.Users.Contains(用户)' –

+0

@DStanley谢谢,只是试图 - 看到错误。你可以看到我的企图代码。 –

回答

3

这是一个神秘的消息众所周知的EF限制:您不能在Contains中使用参考类型。在代替做到这一点:

var userId = user.Id; 
var roles = repository.UserRoles.Where(userRole => userRole.Name == roleName 
        && userRole.Users.Select(u => u.Id).Contains(userId)); 
+0

非常感谢,工作:-) –

0

你检查的user.Id不是负数, 以及所有列Id在两个数据库表User和所有行UserRole永远不会低于零?

+0

我们正在使用GUID,是的,这是处理..谢谢你的想法,但! –

0

您发布的方法不是您错误的来源。查看例外情况 - 您拨打StringBuilder上的AppendFormat,并且您使用的格式字符串具有替换令牌(即{0}),该令牌没有相应的替换变量。

编辑:检查出的痕迹:

System.Text.StringBuilder.AppendFormat(IFormatProvider provider, String format, Object[] args) +10610374 
System.String.Format(IFormatProvider provider, String format, Object[] args) +63 
System.Data.EntityRes.GetString(String name, Object[] args) +363 
System.Data.Entity.Strings.ELinq_UnsupportedConstant(Object p0) +95 
System.Data.Objects.ELinq.ConstantTranslator.TypedTranslate(ExpressionConverter parent, ConstantExpression linq) +1256 
System.Data.Objects.ELinq.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) +88 
System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) +162 
System.Data.Objects.ELinq.ContainsTranslator.TranslateContains(ExpressionConverter parent, Expression sourceExpression, Expression valueExpression) +136 
System.Data.Objects.ELinq.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) +1011 

这看起来像错误是源于您使用的LINQ到实体代码提供商;您在EntityRes.GetString中拉取某种“转换字符串” - 我的猜测是格式字符串中有一个错误。鉴于堆栈跟踪的其余部分,我会猜测在你的LINQ查询的某个地方,你指的是一个常量,它不知道如何正确映射 - 可能在一个contains子句中?

其他需要检查在您发布的方法:

  • user不为空
  • userRole不为空
  • myUser出现 '有效'
  • userRole.Name不是空/空白/空
+0

是的,可能是正确的..但我不明白这是怎么回事?当我通过我们的代码时,我得到了该行的错误,并且该行从实体框架与自动数据库第一个方案对话。有任何想法吗? –

+0

@LarsHoldgaard如果我不得不猜测,我会说你有一些资源字符串,这是错误的格式 - 我将用我的有限分析编辑我的答案。 – JerKimball

相关问题