【问题标题】:How to handle an association table linking the same 2 tables如何处理链接相同 2 个表的关联表
【发布时间】:2012-07-03 21:44:55
【问题描述】:

我正在使用Entity Framework 4.3 code first 使用现有的数据库。

有一个Users table 具有以下列:

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

我有一个名为Impersonations 的关联表。 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)

我有一个带有我想映射到这些列的属性的 User 类:

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

以及我的 Impersonations 表中的以下数据(impersonated id、user id、impersonated user id):

1 7 8
2 7 9

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

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

我也有类似的情况。我有一个产品表和一个规格表。这 2 个由名为 ProductSpecifications 的关联表链接起来。我试图在这里实现相同的目标,但 2 个表将是用户表,关联表是模拟。

【问题讨论】:

  • 这里没有人可以帮助我吗?

标签: c# entity-framework entity-framework-4 ado.net entity-framework-4.1


【解决方案1】:

尝试查看this page 的继承。你的解释不是很好,但我认为这就是你想要达到的目标。

【讨论】:

  • 不,它不是继承。我将更新我的问题以更清楚。
【解决方案2】:

您必须为 Impersonation 创建一个类并将其作为 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;
        }
    }

【讨论】:

  • 谢谢。你能帮我写代码吗?我想通过 fluent api 来实现。
【解决方案3】:

如果我理解得很好,我想我也有同样的想法:用户也是一个组,因此可以有成员。

这是我的代码摘录:

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

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2019-09-08
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多