实体框架,如何从代理转换为对象

时间:2012-08-15 07:36:30

标签: asp.net asp.net-mvc entity-framework

到目前为止,我很喜欢EF。我的项目在尝试将System.Data.Entity.DynamicProxies.Badge转换为Badge时开始崩溃。我不知道该怎么办。我已经阅读了关于Proxies的文档,我对此有所了解。如果它有利于它,我不想禁用代理功能吗?

我该如何解决这个问题?基本上我调用函数MyFunc(myBadge);因为MyFunc采用Badge类型的参数,所以它会崩溃。代码如下:

foreach(Badge B in badgesOfBadgeType) {

Assembly assembly = Assembly.LoadFile(GlobalHelper.GetCurrentContext().Server.MapPath("~") + "bin/MM.dll";
Type classs = assembly.GetType("MM.Helpers.BadgeHelper");
string methodName = "DoesUserEventUnlockBadge_"+B.ID;
MethodInfo methodInfo = classs.GetMethod(methodName);

if (methodInfo != null)
{
    ParameterInfo[] parameters = methodInfo.GetParameters();
    object[] parametersArray = new object[] { B, UE };
    bool didUnlock = (bool)methodInfo.Invoke(null, parametersArray);

    if (didUnlock)
    {
        unlockedBadges.Add(B);
    }
}

}

调用func:

public static bool DoesUserEventUnlockBadge_1(Badge B, UserEvent UE)
        {
            //Check here..
            return true;
        }

新的错误,当我去db.Badges.find(b);并使用它(I.E非代理人)

System.ArgumentOutOfRangeException: The specified parameter type 'System.Data.Entity.DynamicProxies.Badge_90C17B99EFACD091308AD8F9030C6441D90D4237AC5630A4C2F673A79A186B27' is not valid. Only scalar types, such as System.Int32, System.Decimal, System.DateTime, and System.Guid, are supported.
Parameter name: parameter
   at System.Data.Objects.ObjectParameterCollection.Add(ObjectParameter parameter)
   at System.Data.Objects.ObjectContext.CreateQuery[T](String queryString, ObjectParameter[] parameters)
   at System.Data.Entity.Internal.Linq.InternalSet`1.FindInStore(WrappedEntityKey key, String keyValuesParamName)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Find(Object[] keyValues)
   at System.Data.Entity.DbSet`1.Find(Object[] keyValues)
   at MusingMonkey.Helpers.BadgeHelper.UnlockedBadgesForEvent(BaseDBContext db, UserEvent UE, User user) in C:\Users\William-Business\Desktop\TWB\TWB Central\Projects\MusingMonkey\MusingMonkey\Helpers\BadgeHelper.cs:line 31
   at MusingMonkey.Helpers.UserIdeaHelper.PushVoteToIdea(BaseDBContext db, Nullable`1 id, String direction) in C:\Users\William-Business\Desktop\TWB\TWB Central\Projects\MusingMonkey\MusingMonkey\Helpers\UserIdeaHelper.cs:line 164
   at MusingMonkey.Controllers.IdeasController.Vote(Nullable`1 id, String direction) in C:\Users\William-Business\Desktop\TWB\TWB Central\Projects\MusingMonkey\MusingMonkey\Controllers\IdeasController.cs:line 23
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<>c__DisplayClass2a.<BeginInvokeAction>b__20()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult)

2 个答案:

答案 0 :(得分:0)

不知道为什么,但反射有问题,如果我只是将其发送到正常的方法就有效。

答案 1 :(得分:0)

我认为您可以在dbContext类中使用“this.Configuration.ProxyCreationEnabled = false”。