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

Loading a list of entities containing the parent as a property

我在使用 Entity Framework 的代码优先方法时难以实现某些功能。使用 Fluent API 我试图实现一个用户的机构 属性 加载其委托人或代理人包含他作为用户的所有机构实体。

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);
}

由于某种原因,只有委托人设置为拥有用户的机构被加载。我为什么或如何可以替代地实现我所要求的功能有什么想法吗?

您可能需要引入一些连接用户和代理机构的中介 class,例如:

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 调用方面的效果会差很多。

您不能让两个外键引用单个集合。 你必须制作 2 个集合,并将它们中的每一个映射到一个外键。

如果你想拥有一个集合以便于获取,你可以这样做:

    public IList<Agency> Agencies1 { get; set; }
    public IList<Agency> Agencies2 { get; set; }
    [NotMapped]
    public string AllAgencies
    {
        get
        {
            return Agencies1.Concat(Agencies2).ToList();
        }
    }