代码之家  ›  专栏  ›  技术社区  ›  Waldemar

EF代码优先。相关实体未加载

  •  1
  • Waldemar  · 技术社区  · 9 年前

    我有实体框架代码优先实体:

    public class Customer
    {
       public long Id { get; set; }
       public ICollection<ServiceAccount> Accounts { get; set; }
    }
    
    public class Service
    {
       public long Id { get; set; }
    }
    
    public class ServiceAccount
    {
       public long Id { get; set; }
       public Customer Customer { get; set; }
       [Required()]
       public Service Service { get; set; }
    }
    

    假设客户有一些服务帐户。但可能有一些默认账户,这些账户不受任何客户的限制。每个帐户都用于具体的服务。 此实体具有以下配置:

    // Customer Configuration:
    base.ToTable("Customers");
    base.HasKey(x => x.Id);
    base.HasMany(x => x.ServiceAccounts)
        .WithOptional(x => x.Customer)
        .WillCascadeOnDelete();
    // For Service:
    base.ToTable("Services");
    base.HasKey(x => x.Id);
    // For Account:
    base.ToTable("Accounts");
    base.HasKey(x => x.Id);
    base.HasOptional(x => x.Customer)
        .WithMany(x => x.Accounts);
    base.HasRequired(x => x.Service)
        .WithMany();
    

    问题是,当我加载一个客户时,他的所有帐户也会加载,但他们的服务设置为空。为什么未加载?

    提前感谢

    2 回复  |  直到 9 年前
        1
  •  3
  •   Jcl    9 年前

    您需要加载实体。根据您的评论:

    IQueryable<Customer> customers = Customers.Include(x => x.Accounts.Select(y => y.Service));
    

    他们也应该 virtual 如果您希望代理用于延迟加载…但对于快速加载,则无需

        2
  •  1
  •   lc.    9 年前

    延迟加载相关实体需要框架创建实体的代理。尝试使导航属性虚拟化:

    public class ServiceAccount
    {
       public long Id { get; set; }
       public virtual Customer Customer { get; set; }
       [Required]
       public virtual Service Service { get; set; }
    }
    

    或者,使用 Include 或者你甚至可以用 Load .

    有关详细信息,请参阅 https://msdn.microsoft.com/en-us/data/jj574232.aspx