加载包含父项的实体列表 属性
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();
}
}
我在使用 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();
}
}