2

내가 MVC/C 번호에 새로운 오전 사용하여 작은 프로젝트에 대한 작업을 시도 EF 다음의 4 개 가지 클래스가 포함 코드 첫째 : Office, Role, UserOfficeUser을 .다중성 제약/SQL 서버/EF 코드 첫

문제는 UserOfficeUser 자신의 관계를 가지고 또한, User (마스터 역할 ID FK Role.RoleId을 정의) 및 OfficeUser 사이에 같은 Role 클래스를 사용 (Role.RoleId 특히 사무실 FK에 대한 OfficeRoleId를 정의)하는 것을 시도하고있다.

따라서 특정 사용자가 사이트에 로그인 할 때 역할을 받아야하는 AuthorizeAttribute을 사용하여 나의 승인을 작성하려고합니다. 내가 얻을 수행 할 때

public User GetUserRoleByUserName(string userName, string passWord) 
{ 
    using (var context = DataContext) 
    { 
     return context.Users.Include("Role") 
          .Include("OfficeUsers") 
          .SingleOrDefault(u => u.UserName == userName && u.Password == passWord); 
     } 
    } 

나는 위반 오류를

다중성 제약 조건에 따라 얻을. 'Inventory.Repository.User_OfficeUsers'관계 'User_OfficeUsers_Target' 의 역할은 의 다중성 1 또는 0..1입니다.

어떻게 해결할 수 있습니까?

public class Office 
{ 
     public Office() 
     { 
      OfficeUsers = new HashSet<OfficeUser>(); 
     } 

     public int OfficeId { get; set; } 
     public string OfficeName { get; set; } 

     public virtual ICollection<OfficeUser> OfficeUsers { get; set; } 
} 

public class Role 
{ 
    public Role() 
    { 
     Users = new HashSet<User>(); 
     OfficeUsers = new HashSet<OfficeUser>(); 
    } 

    public int RoleId { get; set; } 
    public string RoleName { get; set; } 
    public string Description { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
    public virtual ICollection<OfficeUser> OfficeUsers { get; set; } 
} 

public class User 
{ 
    public User() 
    { 
     OfficeUsers = new HashSet<OfficeUser>(); 
    } 

    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public int RoleId { get; set; } 

    public virtual ICollection<OfficeUser> OfficeUsers { get; set; } 
    public virtual Role Role { get; set; } 
} 

public class OfficeUser 
{ 
    public OfficeUser() 
    { 
    } 

    public int OfficeUserId { get; set; } 
    public int OfficeId { get; set; } 
    public int UserId { get; set; } 
    [ForeignKey("Role")] 
    public int OfficeRoleId { get; set; } 
    public bool Active { get; set; } 

    public User User { get; set; } 
    public Office Office { get; set; } 
    public Role Role { get; set; } 
} 
+0

다중 삭제 경로 문제 외에도 오류를 재현 할 수 없습니다. – Eranga

답변

2

사용자와 사무실 간의 관계를 매핑하기위한 구성을 지정하지 않은 경우 발생할 수 있습니다. 여기에 샘플 구성 클래스

public class UserConfiguration : EntityTypeConfiguration<User> 
    { 
     public LocationConfiguration() 
     { 
      HasKey(a => a.Id); 
      HasMany(user => user.OfficeUsers).WithOptional(officeuser => officeuser.User). 
       HasForeignKey(officeuser => officeuser.UserId); 
     } 
    } 

public class YourContext : DbContext 
    { 

     // your DBSets and contructors, etc 


     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Configurations.Add(new UserConfiguration());    
      base.OnModelCreating(modelBuilder); 
     } 


    } 

편집

시도 데이터 주석을 제거를 다음과 같이 상황이 설정을 추가입니다 "[외래 키 ("역할 ")] 다음과 같이 Role 클래스에 설정을 추가합니다. 또한 당신이 OfficeUser를 쿼리 할 때 당신이 게으른를 사용하는 방법을 아래에 사용할 수 있습니다

public int? OfficeRoleId { get; set; } 

public class RoleConfiguration : EntityTypeConfiguration<Role> 
    { 
     public LocationConfiguration() 
     { 
      HasKey(a => a.RoleId); 
      HasMany(role =>role.OfficeUsers).WithOptional(officeuser => officeuser.Role). 
       HasForeignKey(officeuser => officeuser.OfficeRoleId); 
     } 
    } 

편집

선언 OfficeUser 클래스에서 역할 속성에 OfficeRoleId을 가상 키워드를 추가 로딩

YourQuery().Include(officeuser => officeuser.Role); 

홉 당신은 구문을 이해합니다 감사합니다

+0

Jayanga에게 감사합니다. "modelBuilder.Entity () .HasMany (user => user.OfficeUsers) .WithOptional (officeuser => officeuser.User) .HasForeignKey (officeuser => officeuser.UserId);" 하지만 이제이 오류가 발생합니다 "Multiplicity가 'OfficeUser_Role'관계의 'OfficeUser_Role_Target'역할의 참조 제약 조건과 충돌합니다. 종속 역할의 모든 속성이 nullable이 아니기 때문에 Principal 역할의 다양성은 '1'이어야합니다." modelb.Entity ()을 (를) 사용합니다.HasOptional (c => c.Role) .WithMany (p => p.OfficeUsers) .HasForeignKey (c => c.OfficeRoleId); – hjp

+0

대답을 편집하고 대답을 확인하십시오 – Jayanga

+0

도움을 요청 해 주셔서 감사합니다. 그리고 여전히이 오류를 제공합니다. "다중성은 역할 'Role_OfficeUsers_Source'의 참조 제한 조건과 충돌합니다 (관계 'Role_OfficeUsers'). 종속 역할이 null이 아닌 경우 주체 역할의 다양성은 '1'이어야합니다. " modelBuilder.Entity () .HasMany (role => role.OfficeUsers) .WithOptional (officeuser => officeuser.Role). HasForeignKey (officeuser => officeuser.OfficeRoleId); – hjp