2

我正在使用Entity Framework 4.3 code first使用已經存在的數據庫。如何處理連接相同2個表的關聯表

有一個Users table具有以下欄目:

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

我有一個關聯表稱爲Impersonations。模擬表是用戶表和同一用戶表之間的關聯表。用戶可以有一個用戶列表。這裏是Impersonations table結構:

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

我有,我想映射到這些列屬性的用戶等級:

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; } 
} 

在我的數據庫上下文類我有以下幾點:

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

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

用戶配置:

class UserConfiguration : EntityTypeConfiguration<User> 
{ 
    internal UserConfiguration() 
    { 
      this.Property(x => x.Id).HasColumnName("UserID"); 
      this.Property(x => x.LastName).HasColumnName("Surname"); 
      this.Property(x => x.EmployeeNumber).HasColumnName("StaffNumber"); 

      this.HasMany(i => i.Users) 
       .WithMany(c => c.ImpersonatedUsers) 
       .Map(mc => 
       { 
        mc.MapLeftKey("UserID"); 
        mc.MapRightKey("ImpersonatedUserID"); 
        mc.ToTable("Impersonations"); 
       }); 
    } 
} 

我是否使用實體框架將其正確鏈接?如果我傳遞一個用戶ID,那麼需要返回一個用戶列表,這個用戶列表被標記爲匿名用戶。我如何做到這一點?我有這個,但二者的用戶和ImpersonatedUsers都是空的:

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

可以說,我有我的用戶表如下數據(ID,姓,名,員工數量):

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

而且在我的模仿秀表如下數據(模擬的ID,用戶ID,模擬用戶ID):

1 7 8 
2 7 9 

所以,如果我通過以7:3的用戶ID,然後它需要返回記錄用戶蘇珊倫肖和麥克風helle du Toit。

只是爲了清楚起見,如果你還在迷茫...

我有類似的情況。我有一個產品表和一個規格表。這兩個由名爲ProductSpecifications的分析錶鏈接起來。我試圖在這裏實現相同的功能,但是2個表將是Users表,並且關聯表是Impersonations。

+0

沒有人可以幫助我嗎? –

回答

0

如果我非常理解,我想我有完全一樣的:用戶也是一組,因此可以擁有成員。

這裏是我的代碼的摘錄:

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; } 
} 

具有以下配置:

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")); 
    } 
} 

從這裏得到一個組的成員查詢很簡單:

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

這將給IEnumerable

0

嘗試看看this page繼承。你的解釋並不好,但我認爲這是你想要達到的目標。

+0

諾普爾它不是繼承。我會更新我的問題,以便更清楚。 –

+0

我已更新我的問題以獲得更多清晰度。 –

0

您必須爲模擬創建一個類並將其作爲DBSet添加到dbcontext。 EF可能會讓您在外鍵字段上添加一個[Key]屬性,以及[Column(Order = 0 or 1)]。

然後你可以延遲加載的特性:

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

爲了更加清晰,我更新了我的問題。 –