加载包含父项作为属性的实体列表

时间:2015-11-20 11:07:25

标签: c# entity-framework ef-code-first ef-fluent-api

在使用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设置为拥有用户的代理商。任何想法为什么或如何我可以实现我要求的功能?

2 个答案:

答案 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();
        }
    }