2013-11-21 7 views
0

Я разрабатываю службу WCF RESTful с библиотекой Entity Framework Code First 4.4.0.0, C# и .NET Framework 4.0.Прокси-объекты WCF и Entity Framework

Я пытаюсь получить группы, где user_id является членом этого метода:

public List<Group> GetUserGroups(string user_id) 
{ 
    List<Group> groups = null; 
    int userId; 
    OutgoingWebResponseContext ctx = 
     WebOperationContext.Current.OutgoingResponse; 

    // Check parameters. It will throw an exception. 
    ParameterCheck.CheckObjectId(user_id); 

    // Parase parameter to int. 
    userId = Int32.Parse(user_id); 

    try 
    { 
     using (var context = new MyContext()) 
     { 
      //context.Configuration.ProxyCreationEnabled = false; 
      //context.Configuration.LazyLoadingEnabled = false; 

      User user = context.Users.Find(userId); 

      if (user == null) 
      { 
       ThrowCustomWebException(
        (int)ExceptionReasons.InvalidUser, 
        (int)ExceptionDetailedInformation.UserNotFound); 
      } 
      else 
      { 
       var grps = from g in context.Groups.Include("Users").Include("WantsToDo") 
          from u in g.Users 
          where u.UserId == userId 
          select g; 

       if ((grps == null) || 
        (grps.Count() == 0)) 
       { 
        ctx.StatusCode = System.Net.HttpStatusCode.NotFound; 
        ctx.SuppressEntityBody = true; 
       } 
       else 
       { 
        foreach (Group group in grps) 
        { 
         group.UsersIds = group.Users.Select(u => u.UserId).ToList(); 
         group.ActivityIds = group.WantsToDo.Select(a => a.ActivityId).ToList(); 
        } 
        groups = grps.ToList(); 

        ctx.StatusCode = System.Net.HttpStatusCode.OK; 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     // ReThrow this exception because we need to indicate that the user is 
     // invalid because there isn't that user on database. 
     if ((ex is WebFaultException<ErrorData>)) 
      throw; 
     else 
     { 
      TraceTool.WriteTraceLog(ex, "GetUserGroups"); 

      ctx.StatusCode = System.Net.HttpStatusCode.InternalServerError; 
      ctx.SuppressEntityBody = true; 
     } 
    } 

    return groups; 
} 

Но, у меня есть проблемы с WCF, потому что, здесь:

group.UsersIds = group.Users.Select(u => u.UserId).ToList(); 

group является Proxy объект.

Но если я context.Configuration.ProxyCreationEnabled = false; или context.Configuration.LazyLoadingEnabled = false;, то group не прокси, но group.Users равно нулю.

Как исправить эту проблему?

ответ

3

Попробуйте это:

var groups = from g in context.Groups   //Get all Groups in the database 
           .Include("Users") //Get the User data too 
           .Include("WantsToDo") //Get the WantsToDo data too 
where g.Users.Any(u => u.UserId == user_id) //Only get groups where the user_id 
              //is in Users collection 
select g 

Вам не нужно Включает, если вы не собираетесь доступ к этим данным позже

+0

Отлично !!! Это работает!!! Можете ли вы объяснить мне, почему? Благодарю. – VansFannel

+0

Я добавил несколько комментариев, которые помогают? http://msdn.microsoft.com/en-us/library/vstudio/bb397933.aspx – Colin

Смежные вопросы