我正在使用已有数据库的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; }
}
在我的db上下文类中,我有以下内容:
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");
});
}
}
我是否使用Entity Framework正确链接了这个?如果我通过用户ID,则需要返回标记为inpersonated用户的用户列表。我是怎么做到的我有这个,但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表中的以下数据(模拟ID,用户ID,模拟用户ID):
1 7 8
2 7 9
因此,如果我传入用户ID为7,则需要为用户Susan Renshaw和Michelle du Toit返回记录。
为了清楚起见,如果你仍然感到困惑......
我有类似的情况。我有一个Products表和一个规格表。这两个由名为ProductSpecifications的辅助表链接。我试图在这里实现相同的目标,但是2个表将是Users表,关联表是Impersonations。
答案 0 :(得分:0)
尝试查看继承的this page。你的解释不是很好,但我认为这是你想要实现的目标。
答案 1 :(得分:0)
您必须为Impersonation创建一个类,并将其作为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;
}
}
答案 2 :(得分: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