我正在使用已经存在的数据库使用Entity Framework 4.3 code first

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,则需要返回被标记为个性化用户的用户列表。我该怎么做?我有这个,但是User和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


因此,如果我输入的用户ID为7,则它需要返回用户Susan Renshaw和Michelle du Toit的记录。

为了清楚起见,如果您仍然感到困惑...

我也有类似的情况。我有一个产品表和一个规格表。这两个链接通过名为ProductSpecifications的辅助表进行链接。我试图在这里实现相同的目标,但是2个表将是Users表,而关联表是Impersonations。

最佳答案

如果我很了解,我想我也有相同的看法:用户也是一个组,因此可以有成员。

这是我的代码的一部分:

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

关于c# - 如何处理关联相同2个表的关联表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11311272/

10-16 09:07