2014-02-10 122 views
0

我有一個實體更改其狀態的過程,我想要獲取允許當前用戶轉移到的狀態,當評估時有以下表達式我發現了一個NotSupportedException異常與消息:實體框架6:按角色解析用戶權限(IdentityUserRole)

無法創建 類型「Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole」的恆定值。在此上下文中僅支持 基元類型或枚舉類型。

var user = db.Users.Single(...); //Successfully Retrieve the user 
var states = db.StateTransitions 
    .Join(db.RoleStateTransitions 
     .Join(user.Roles, 
      rst => rst.RoleID, 
      ur => ur.RoleId, 
      (rst, ur) => rst), 
     wst => wst.StateTransitionID, 
     rst => rst.StateTransitionID, 
     (wst, rst) => wst.FinalState) ; 

正如你可以看到user.Roles連接(IdentityUserRole的集合)的問題。以前的表達有什麼問題?

回答

1

問題是user.Roles是對象的本地集合。 EF無法將本地對象轉換爲SQL(即使它們是映射對象)。但是,你可以把它通過減少本地集合原始類型的工作:

var userRoleIds = db.Users.Where(u => u.UserId == id) 
        .SelectMany(u => u.Roles.Select(r => r.RoleId)) 
        .ToList(); 

var states = from wst in db.StateTransitions 
      join rst in db.RoleStateTransitions 
          .Where(x => userRoleIds.Contains(x.RoleId)) 
       on wst.StateTransitionID equals rst.StateTransitionID 
      select wst.FinalState; 

,或者甚至一個查詢:

var states = from wst in db.StateTransitions 
      join rst in db.RoleStateTransitions 
       on wst.StateTransitionID equals rst.StateTransitionID 
      join role in db.Roles 
       on rst.ROleId equals role.RoleId 
      where role.Users.Any(u => u.UserId == id) 
      select wst.FinalState; 

(假設有一個許多人UserRole之間有許多)。

+0

格特,我已經意識到這個問題,它現在運行良好,無論如何,我喜歡你的第二種方法。目前我只有一個從用戶到角色的一對多,但我正在評估配置他們之間的多對多關係,並以這種方式。謝謝 –