如何处理关联表联同2个表(How to handle an association table li

2019-09-19 01:06发布

我使用的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则需要用户的列表要返回标记为inpersonated用户。 我该怎么做呢? 我有这个,但二者的用户和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,然后它需要返回记录用户苏珊伦肖和米歇尔都伊特。

只是为了清楚起见,如果你还在迷茫......

我有一个类似的情况。 我有一个产品表和规格表。 这2个是由assication表称为ProductSpecifications联系起来。 我想在这里实现相同,但2个表将是用户表和关联表是模仿秀。

Answer 1:

如果我很理解,我想我有完全一样的:用户也是一组,因此可以拥有成员。

下面是我的代码的摘录:

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



Answer 2:

尝试采取看看这个页面上的继承。 你的解释是不是很大,但我认为这是你想要达到的目标。



Answer 3:

你必须创建一个类模拟,并将其添加为DBSet到的DbContext。 EF可能会让你把外键字段[关键]属性,连同[列(订单= 0或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;
        }
    }


文章来源: How to handle an association table linking the same 2 tables