在使用Entity Framework的Code First方法时,我在完成某些功能方面遇到了困难。使用Fluent API我试图完成用户的Agencies属性加载其Principal或Agent包含他作为用户的所有Agency实体。
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public IList<Agency> Agencies { get; set; }
}
public class Agency
{
public int Id { get; set; }
[Required]
public User Principal { get; set; }
[Required]
public User Agent { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().HasMany(u => u.Agencies).WithRequired(a => a.Agent).WillCascadeOnDelete(true);
modelBuilder.Entity<User>().HasMany(u => u.Agencies).WithRequired(a => a.Principal).WillCascadeOnDelete(true);
}
由于某种原因,仅加载其Principal设置为拥有用户的代理商。任何想法为什么或如何我可以实现我要求的功能?
答案 0 :(得分:0)
您可能需要介绍一些连接用户和代理商的中间类,如:
public class AgencyUser {
public int Id {get;set;}
public Agency Agency {get;set;}
public User User {get;set;}
public UserRole UserRole {get;set;}
}
public enum UserRole {
Principal,
Agent
}
因此,您的代理商将在其中包含AgencyUser列表,User.Agencies将是AgencyUser类型的集合。 否则,我认为在SQL调用方面它的效率会低得多。
答案 1 :(得分:0)
您不能通过两个外键引用单个集合。 您必须制作2个集合,并将每个集合映射到一个外键。
如果您想拥有一个集合以便于提取,您可以执行以下操作:
public IList<Agency> Agencies1 { get; set; }
public IList<Agency> Agencies2 { get; set; }
[NotMapped]
public string AllAgencies
{
get
{
return Agencies1.Concat(Agencies2).ToList();
}
}