C# 如何处理链接相同2个表的关联表

C# 如何处理链接相同2个表的关联表,c#,entity-framework,entity-framework-4,ado.net,entity-framework-4.1,C#,Entity Framework,Entity Framework 4,Ado.net,Entity Framework 4.1,我首先使用的是实体框架4.3代码使用的是一个已经存在的数据库 有一个用户表,其中包含以下列: - UserID (int) - FirstName (string) - Surname (string) 我有一个名为模拟的关联表。模拟表是用户表和同一用户表之间的关联表。用户可以有一个用户列表。以下是模拟表的结构: - ImpersonateID (int primary key) - UserID (int FK to Users table's UserID column) - Impers

我首先使用的是
实体框架4.3代码
使用的是一个已经存在的数据库

有一个
用户表
,其中包含以下列:

- UserID (int)
- FirstName (string)
- Surname (string)
我有一个名为
模拟的关联表
。模拟表是用户表和同一用户表之间的关联表。用户可以有一个用户列表。以下是模拟表的结构:

- 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; }
}
假设我的Users表中有以下数据(id、名字、姓氏、员工编号):

以及“我的模拟”表中的以下数据(模拟id、用户id、模拟用户id):

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

如果您仍然感到困惑,请澄清…


我也有类似的情况。我有一张产品表和一张规格表。这两个由名为ProductSpecifications的辅助表连接。我试图在这里实现同样的效果,但这两个表将是用户表,而关联表是模拟表。

试着看看继承。你的解释不太好,但我认为这正是你想要实现的。

试着看看继承。您的解释不太好,但我认为这正是您想要实现的。

您必须创建一个模拟类,并将其作为DBSet添加到dbcontext中。EF可能会使您在外键字段中添加[Key]属性,以及[Column(Order=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;
        }
    }
公共虚拟列表用户模拟
{
收到
{
if(_userImpersonations==null)
{
//设置_用户模拟=
//使用linq到sql查询的延迟加载,其中
//UserImpersonations.UserId=this.UserId
}
返回用户模拟;
}
}

您必须为模拟创建一个类,并将其作为DBSet添加到dbcontext中。EF可能会使您在外键字段中添加[Key]属性,以及[Column(Order=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;
        }
    }
公共虚拟列表用户模拟
{
收到
{
if(_userImpersonations==null)
{
//设置_用户模拟=
//使用linq到sql查询的延迟加载,其中
//UserImpersonations.UserId=this.UserId
}
返回用户模拟;
}
}

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

以下是我的代码摘录:

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

,如果我能很好地理解的话,我想我有完全相同的:用户也是一个组,因此可以有成员

以下是我的代码摘录:

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

不,除非它不是继承。我会更新我的问题,让它更清楚。不,这不是继承。我会更新我的问题,使之更清楚。谢谢。你能帮我查一下密码吗?我想通过fluent api来完成。谢谢。你能帮我查一下密码吗?我想通过fluent api来实现。这里没有人可以帮助我吗?这里没有人可以帮助我吗?
1 7 8
2 7 9
    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;
        }
    }
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()