2015-01-23 4 views
0

IdentityDBContext를 확장하여 테이블 이름의 이름을 바꾸었지만 사용자와 역할간에 많은 관계를 잃어버린 것처럼 보입니다. LINQ는 더 이상 올바른 관계를 따기되지 않는다 (추신 intellisence 스크린 샷 참조)에 대한 답변으로 1ID 테이블의 이름 바꾸기 및 관계 유지 관리

제안

namespace Carbon.Models { 
    public partial class CarbonEDM : IdentityDbContext<User, Role, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>{ 
     public CarbonEDM() 
      : base("name=CarbonDB") { 
     } 

     public DbSet<Message> Messages { get; set; } 


     public static CarbonEDM Create() { 
      return new CarbonEDM(); 
     } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) { 

      base.OnModelCreating(modelBuilder); 

      modelBuilder.Entity<User>().ToTable("Users", "dbo"); 
      modelBuilder.Entity<Role>().ToTable("Roles", "dbo"); 
      modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles", "dbo") ; 
      modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims", "dbo"); 
      modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins", "dbo"); 

     } 
    } 
} 

enter image description here

업데이트, 신원에는 탐색 속성이 없습니다 역할 모델, 그래서 나는 다음 시도 :

var users = from usr in db.Users 
       select new UserInfoViewModel{ 
        email = usr.Email, 
        name = usr.Name, 
        role_name = db.Roles.Find(usr.Roles.FirstOrDefault().RoleId).Name 
       }; 

하지만 여전히 IM gettin 다른 오류 : Method 'Carbon.Models.Role Find(System.Object[])' declared on type 'System.Data.Entity.IDbSet 1 Carbon.Models.Role] '타입의 인스턴스를 호출 할 수 없습니다'System.Data.Entity.Core.Objects.ObjectQuery 1[Carbon.Models.Role]

난 그냥 모든 사용자의 목록을 얻으려면 그리고 그들의 역할.

+0

'UserInfoViewModel'모양이 어떻게됩니까? 이것은'users'의 일반 argumnet 유형입니다 (컴파일러에서 유형을 알려주도록 VS에서 마우스를 가리킬 수도 있습니다). – ryanyuyu

답변

1

User.Roles은 Role 개체 모음이 아닙니다. 역할 대 사용자는 다 대다 관계이므로 사용자와 역할 간에는 UserIdRoleId의 두 열만있는 IdentityUserRoles 테이블이 있으며 이는 사용자가 선택하는 것과 정확히 같습니다. 이는 테이블의 이름을 변경했기 때문이 아닙니다. 기본적으로이 이름이 사용됩니다.

사용자의 역할 개체를 가져 오려면 -이 사용자의 모든 RoleId를 가져온 다음 제공된 ID가있는 모든 역할을 가져옵니다.

+0

그렇지만 Linq가 자동으로 중간 테이블과의 많은 관계를 자동으로 탐지하면 안됩니다. 예를 들어 http://www.entityframeworktutorial.net/EntityFramework4.3/add-many-to-many-entity-using-dbcontext. aspx를 사용하고 중간 테이블 대신 User.Roles 컬렉션을 제공합니다. –

+0

ID는 이러한 탐색 속성을 제공하지 않습니다. 그것이 코딩 된 것입니다. 이것이 이루어 졌다고 믿기 때문에 Identity는 EF뿐만 아니라 여러 가지 지속 기술에 사용될 수 있습니다. – trailmax

+0

@trailnax @trailnax 질문을 업데이트했지만 여전히 일반 ef 쿼리로 역할이있는 사용자 목록을 얻지 못합니다. –

0

사용자 모델에서 역할 모음을 지정할 수 있으며 역할 모델에서 사용자 모음을 지정할 수 있습니다. 이렇게하면 탐색 속성이 만들어집니다. 예를 들어

:

public class User{ 

ICollection<Role> Roles {get; set;} 

} 

그리고

public class Role{ 

ICollection<User> Users {get; set;} 

} 

그런 다음 필요에 따라 역할을로드하는 명시 적 또는 열망로드를 사용할 수 있습니다.