【问题标题】:EF navigation property include doesn't loadEF导航属性包括不加载
【发布时间】:2014-09-30 13:14:50
【问题描述】:

我正在尝试访问我的RegisterCountLog 上的Register 导航属性。由于某种原因,它始终为空。因此,当我尝试访问 RegisterName 时,它​​始终为空。

public IQueryable<RegisterCountLog> GetCountsForDevice(long deviceSerial)
{
    return this.ServiceCollection.GetAll(c => c.Register)
               .Where(c => c.DeviceSerial == deviceSerial).AsNoTracking();
}

请注意,ServiceCollection.GetAll() 将(或应该)包括Register。该特定位之后的查询又名queryableLogs

SELECT 
    [Extent2].[Contribution] AS [Contribution], 
    [Extent1].[DeviceSerial] AS [DeviceSerial], 
    [Extent1].[LogEntryID] AS [LogEntryID], 
    [Extent1].[RegisterId] AS [RegisterId], 
    [Extent1].[Value] AS [Value], 
    [Extent1].[Timestamp] AS [Timestamp], 
    [Extent2].[RegisterId] AS [RegisterId1], 
    [Extent2].[DeviceSerial] AS [DeviceSerial1], 
    [Extent2].[RegisterName] AS [RegisterName], 
    [Extent2].[ZoneEntrance_ZoneEntranceID] AS [ZoneEntrance_ZoneEntranceID]
    FROM  [dbo].[RegisterCountLogs] AS [Extent1]
    INNER JOIN [dbo].[Registers] AS [Extent2] 
          ON  ([Extent1].[RegisterId] = [Extent2].[DeviceSerial]) 
          AND ([Extent1].[DeviceSerial] = [Extent2].[RegisterId])

它是这样使用的:

var queryableLogs = countLogService.GetCountsForDevice(serialNumber);
var groupedLogs= gLogs
    .Select(r => new Register
    {
        RegisterId = r.FirstOrDefault().RegisterId,
        RegisterName = r.FirstOrDefault().Register.RegisterName, // Here!
        DeviceSerial = r.FirstOrDefault().DeviceSerial,
        CountLogs = r.GroupBy(rc => 
                              new {Day = SqlFunctions
                                        .DatePart("dy", rc.Timestamp)})
                     .Select(rl => new RegisterCountLog()
                                   {
                                     Value = rl.to FirstOrDefault().Value,
                                     Timestamp = rl.FirstOrDefault()
                                                   .Timestamp,
                                   })
                     .OrderByDescending(l => l.Timestamp)
                     .ToList()
    })
    .Where(r=>r.CountLogs.Count() > 0)
    .OrderByDescending(r => r.RegisterId)
    .ToList();

除了RegisterName 始终为空之外,一切都运行良好。如果我查看查询 Register 也是空的。为什么加载不出来?

这里是 EF 类

public class RegisterCountLog
{
    [Key, Column(Order = 1)]
    [ForeignKey("Register")]
    public long DeviceSerial { get; set; }

    [Key, Column(Order = 2)]
    public long LogEntryID { get; set; }

    [Key, Column(Order = 3)]
    [ForeignKey("Register")]
    public long RegisterId { get; set; }

    public long Value { get; set; }

    public DateTime Timestamp { get; set; }

    public Register Register { get; set; }
}

public class Register
{
    public enum ContributionType
    {
        FlowIn,
        FlowOut
    }

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Key, Column(Order = 1)]
    public long RegisterId { get; set; }

    [Key]
    [ForeignKey("Device"), Column(Order = 2)]
    public long DeviceSerial { get; set; }

    [StringLength(50)]
    public string RegisterName { get; set; }

    public ContributionType Contribution { get; set; }    

    public virtual Device Device { get; set; }
}

【问题讨论】:

  • 在获取 RegisterCountLog 集合以进行即时加载时,将寄存器设为虚拟以启用延迟加载或使用 .Include(x =&gt; x.Register) 方法。
  • .GetAll() 应该预加载它(我使用存储库模式),我也尝试过使用虚拟但没用..我会再试一次以防万一

标签: c# entity-framework navigation-properties


【解决方案1】:

您可能正在使用即时加载,并且您必须指定 .Include(x =&gt; x.Register).Include("Register"),具体取决于您的 EF 版本

如果您将变量命名为“好”,则可能会出现另一个问题(对于分组的事物,急切加载并不好)。一种方法是在选择某些内容之前枚举查询(列出)。 (如果没有性能问题)

编辑:当我阅读您之前的评论时,我真的认为是按问题分组(分组更改您的 linq 结构,并且 include 无法正常工作)

方法是这样的:

var groupedPersons     = db.Appointments
                        .Include_Service()
                        .Include_Location()
                        .Include_Room()
                        .IncludeEhr_Patient()
                        .IncludeEhr_Person()
                        .IncludeEhr_Personal()
                        .ToList() // see that i enumerate before i group by
                        .GroupBy(x => x.PersonId).Select()[.ToList()] 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2022-01-04
    • 2015-11-13
    • 1970-01-01
    • 2020-05-23
    • 2020-05-30
    相关资源
    最近更新 更多