【发布时间】: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 => x.Register)方法。 -
.GetAll()应该预加载它(我使用存储库模式),我也尝试过使用虚拟但没用..我会再试一次以防万一
标签: c# entity-framework navigation-properties