Я пытаюсь получить доступ к навигационной собственности Register
на моем RegisterCountLog
.. По какой-то причине он всегда равен нулю. Поэтому, когда я пытаюсь получить доступ к RegisterName, он всегда равен нулю.EF navigation property include не загружается
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
тоже имеет значение null. Почему он не загружается?
Вот классы 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; }
}
Сделать зарегистрировать виртуальный, чтобы позволить отложенной загрузки или использовать '.INCLUDE (х => x.Register)' метода при извлечении вашей коллекции 'RegisterCountLog' для нетерпеливого нагрузки. –
'.GetAll()' должен предварительно загрузить его (im используя шаблон репозитория), я тоже пробовал с виртуальным, но это не сработало. Повторите попытку на всякий случай – Chris