2

Entity Framework 4.3 code first을 사용하고 있습니다. 기존 데이터베이스를 사용하고 있습니다.동일한 테이블을 연결하는 연관 테이블을 처리하는 방법

에는 다음과 같은 열이있는 Users table 있습니다 :

- UserID (int) 
- FirstName (string) 
- Surname (string) 

내가 연관 테이블 Impersonations라고합니다. 가장 테이블은 사용자 테이블과 동일한 사용자 테이블 간의 연결 테이블입니다. 사용자는 사용자 목록을 가질 수 있습니다.

- ImpersonateID (int primary key) 
- UserID (int FK to Users table's UserID column) 
- ImpersonatedUserID (int FK to Users table's UserID column) 

내가이 컬럼에 매핑 원하는 특성을 가진 사용자 클래스가 : 여기 Impersonations table 구조는

public DbSet<User> Users { get; set; } 

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

내 DB 컨텍스트 클래스에서
public class User : IEntity 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string EmployeeNumber { get; set; } 
    public virtual ICollection<User> ImpersonatedUsers { get; set; } 
    public virtual ICollection<User> Users { get; set; } 
} 

나는 다음이

사용자 구성 :

이 링크를 Entity Framework를 사용하여 올바르게 연결 했습니까? 사용자 아이디를 통과하면 사칭되지 않은 사용자로 표시된 사용자 목록을 반환해야합니다. 내가 어떻게하는거야? 나는이 문제를 가지고 있지만 사용자 및 ImpersonatedUsers 모두 비어 있습니다 :

7 Craig Matthews 123456 
8 Susan Renshaw 234567 
9 Michelle du Toit 34567 

그리고 :

return DbContext.Users 
    .Include("ImpersonatedUsers") 
    .SingleOrDefault(x => x.Id == userId); 

내가 내 사용자 테이블에서 다음 데이터 (아이디, 이름, 성, 직원 번호)가 있다고 가정하자 그래서

1 7 8 
2 7 9 

나는 7의 사용자 ID에 전달하면 다음 사용자 수잔 렌쇼와 마이크에 대한 레코드를 반환해야합니다 내 흉내 내기 테이블에 다음과 같은 데이터는 (가장 된 ID, 사용자 ID, 사용자 ID를 가장 한) helle du Toit.

그냥 당신이 아직도 혼동하는 경우 선명도

... 나는 비슷한 상황이있다. 제품 테이블과 사양 테이블이 있습니다. 이 2 개는 ProductSpecifications라는 보증 테이블에 의해 연결됩니다. 여기에서도 같은 결과를 얻으려고하지만 2 개의 테이블은 Users 테이블이고 연관 테이블은 가장입니다.

+0

여기있는 사람이 있습니까? –

답변

0

, 나는 꽤 같은 생각 : 사용자가 구성원을 가질 수 있도록 또한 그룹입니다.

context.Users.Where(u => u.Id == someId).Select(u => u.Members).FirstOrDefault() 
:

public class UserConfiguration : EntityTypeConfiguration<VDE.User> { 
    public UserConfiguration() 
     : base() { 
     ToTable("Users", "dbo"); 

     Property(u => u.EMail).IsRequired().HasColumnType("nvarchar").HasMaxLength(100); 
     Property(u => u.Login).IsRequired().HasColumnType("nvarchar").HasMaxLength(20); 
     Property(u => u.Password).IsRequired().HasColumnType("nvarchar").HasMaxLength(50); 
     Property(u => u.Description).HasColumnType("nvarchar").HasMaxLength(200); 
     Property(u => u.LastConnectionDate).HasColumnType("datetime2"); 

     HasMany(u => u.Members).WithMany().Map(m => m.MapLeftKey("UserId").MapRightKey("MemberId").ToTable("UserMembers")); 
    } 
} 
여기에서

쿼리가 쉬운 그룹의 구성원을 얻기 위해 다음 구성

public partial class User : AuthorizableBaseObject, IHasUID { 
    public User() { 
     Members = new List<User>(); 
    } 

    public Guid UID { get; set; } 
    public DateTime EmailValidationDate { get; set; } 

    public String EMail { get; set; } 

    //public Int64 Id { get; set; } 
    public String Login { get; set; } 
    public String Password { get; set; } 
    public String Description { get; set; } 
    public DateTime LastConnectionDate { get; set; } 

    public Boolean CanConnect { get; set; } 
    public Boolean IsDisabled { get; set; } 

    public virtual List<User> Members { get; set; } 
} 

: 여기

내 코드의 추출물

그러면 IEnumerable이됩니다.

0

상속에 대해 this page을보십시오. 당신의 설명은 훌륭하지 않지만, 이것이 당신이 성취하려고 시도하는 것이라고 생각합니다.

+0

Nopre 상속이 아닙니다. 나는 더 명확하게 나의 질문을 업데이트 할 것이다. –

+0

더 명확하게하기 위해 제 질문을 업데이트했습니다. –

0

가장 (Impersonation) 클래스를 만들어 DBContext에 DBSet으로 추가해야합니다. EF는 [Key (Order = 0 or 1)]와 함께 외래 키 필드에 [Key] 속성을 넣을 수 있습니다.

그럼 할 수 있습니다 게으른로드 속성 : 나는 잘 이해한다면

public virtual List<Impersonation> UserImpersonations 
    { 
     get 
     { 
      if(_userImpersonations == null) 
      { 
      // Set _userImpersonations = 
      // lazy load using a linq to sql query where 
      // UserImpersonations.UserId = this.UserId 
      } 

      return __userImpersonations; 
     } 
    } 
+0

감사합니다. 코드를 도와 주시겠습니까? 나는 유창한 API를 통해 그것을하고 싶다. –

+0

더 명확하게하기 위해 제 질문을 업데이트했습니다. –

관련 문제