ef 核心导航 属性 加载失败
ef core navigation property fails to load
我的应用是Ef core 2.2,没有启用延迟加载。
在 MapAddress 方法地址对象的 Country 对象为空,虽然我有
Include(a => a.Address).ThenInclude(a => a.Country)
急切加载国家
var agentWalletResponse = (from wd in dbContext.WalletDetail.Where(w => w.WalletDetailId == agentWalletDetailId)
join c in dbContext.CorporateInfo.Include(a => a.Address).ThenInclude(a => a.Country).Where(d => !d.IsDeleted) on wd.WalletSubscriptionId equals c.OwnerUserId
select new AgentWalletResponse()
{
Address = MapAddress(c.Address),
Balance = wd.AvailableBalance,
CreatedOn = wd.CreatedOn
}).FirstOrDefault();
地图地址
protected AddressModel MapAddress(Address address)
{
if (address == null)
return null;
return new AddressModel
{
AddressId = address.AddressId,
AddressLine = address.AddressLine1,
City = address.City,
Country = address.Country?.Name,
Province = address.Province,
Division = address.Division,
PhoneNumber = address.PhoneNumber,
PostalCode = address.PostalCode
};
}
更改 then include 表达式。
在dbContext.CorporateInfo.Include中加入c(a => a.Address).ThenInclude(a => a.Address.Country)...
使用这个
var agentWalletResponse = (from wd in dbContext.WalletDetail.Where(w => w.WalletDetailId == agentWalletDetailId)
join c in dbContext.CorporateInfo.Include(a => a.Address).ThenInclude(a => a.Country).Where(d => !d.IsDeleted) on wd.WalletSubscriptionId equals c.OwnerUserId
select new AgentWalletResponse()
{
Address = new AddressModel
{
AddressId = c.Address.AddressId,
AddressLine = c.Address.AddressLine1,
City = c.Address.City,
Country = c.Address.Country?.Name,
Province = c.Address.Province,
Division = c.Address.Division,
PhoneNumber = c.Address.PhoneNumber,
PostalCode = c.Address.PostalCode
},
Balance = wd.AvailableBalance,
CreatedOn = wd.CreatedOn
}).FirstOrDefault();
我通过引入另一种接受 CorporateInfo 而不是地址的中间方法实现了这一点。
var agentWalletResponse = (from wd in dbContext.WalletDetail
join ws in dbContext.WalletSubscription on wd.WalletSubscriptionId equals ws.WalletSubscriptionId
join ci in dbContext.CorporateInfo.Include(a => a.Address).ThenInclude(a => a.Country).Where(d => !d.IsDeleted) on wd.WalletSubscriptionId equals ci.OwnerUserId
join wc in dbContext.Currency on wd.CurrencyId equals wc.CurrencyId
join ac in dbContext.AgentCommission on ws.WalletSubscriptionId equals ac.WalletSubscriptionId into y
from agentComms in y.DefaultIfEmpty()
join kf in dbContext.KokuFee on ws.WalletSubscriptionId equals kf.WalletSubscriptionId into z
from kf_all in z.DefaultIfEmpty()
where ws.WalletType.Equals(WalletType.Agent) && !kf_all.IsDeleted && wd.WalletDetailId.Equals(agentWalletDetailId)
&& !agentComms.IsDeleted
select new AgentWalletResponse
{
Alias = ws.Alias,
Address = MapAddress(ci),
AgentSubscriptionId = ws.WalletSubscriptionId,
AgentWalletDetailId = wd.WalletDetailId,
SubscriptionNo = ws.SubscriptionNo,
Balance = wd.AvailableBalance,
CurrencyCode = wc.CurrencyCode,
Commission = agentComms == null ? 0 : agentComms.Commission,
TopupFee = kf_all == null ? 0 : kf_all.AbsoluteFee,
CreatedOn = wd.CreatedOn
}).FirstOrDefault();
//When use directly ef core fails to load the country of the address.
protected AddressModel MapAddress(CorporateInfo corporateInfo)
{
return MapAddress(corporateInfo.Address);
}
我想的是,当我在投影中请求 C.Address 时,它只是在查询生成时忽略了我的 ThenInclude 命令。
我的应用是Ef core 2.2,没有启用延迟加载。
在 MapAddress 方法地址对象的 Country 对象为空,虽然我有
Include(a => a.Address).ThenInclude(a => a.Country)
急切加载国家
var agentWalletResponse = (from wd in dbContext.WalletDetail.Where(w => w.WalletDetailId == agentWalletDetailId)
join c in dbContext.CorporateInfo.Include(a => a.Address).ThenInclude(a => a.Country).Where(d => !d.IsDeleted) on wd.WalletSubscriptionId equals c.OwnerUserId
select new AgentWalletResponse()
{
Address = MapAddress(c.Address),
Balance = wd.AvailableBalance,
CreatedOn = wd.CreatedOn
}).FirstOrDefault();
地图地址
protected AddressModel MapAddress(Address address)
{
if (address == null)
return null;
return new AddressModel
{
AddressId = address.AddressId,
AddressLine = address.AddressLine1,
City = address.City,
Country = address.Country?.Name,
Province = address.Province,
Division = address.Division,
PhoneNumber = address.PhoneNumber,
PostalCode = address.PostalCode
};
}
更改 then include 表达式。
在dbContext.CorporateInfo.Include中加入c(a => a.Address).ThenInclude(a => a.Address.Country)...
使用这个
var agentWalletResponse = (from wd in dbContext.WalletDetail.Where(w => w.WalletDetailId == agentWalletDetailId)
join c in dbContext.CorporateInfo.Include(a => a.Address).ThenInclude(a => a.Country).Where(d => !d.IsDeleted) on wd.WalletSubscriptionId equals c.OwnerUserId
select new AgentWalletResponse()
{
Address = new AddressModel
{
AddressId = c.Address.AddressId,
AddressLine = c.Address.AddressLine1,
City = c.Address.City,
Country = c.Address.Country?.Name,
Province = c.Address.Province,
Division = c.Address.Division,
PhoneNumber = c.Address.PhoneNumber,
PostalCode = c.Address.PostalCode
},
Balance = wd.AvailableBalance,
CreatedOn = wd.CreatedOn
}).FirstOrDefault();
我通过引入另一种接受 CorporateInfo 而不是地址的中间方法实现了这一点。
var agentWalletResponse = (from wd in dbContext.WalletDetail
join ws in dbContext.WalletSubscription on wd.WalletSubscriptionId equals ws.WalletSubscriptionId
join ci in dbContext.CorporateInfo.Include(a => a.Address).ThenInclude(a => a.Country).Where(d => !d.IsDeleted) on wd.WalletSubscriptionId equals ci.OwnerUserId
join wc in dbContext.Currency on wd.CurrencyId equals wc.CurrencyId
join ac in dbContext.AgentCommission on ws.WalletSubscriptionId equals ac.WalletSubscriptionId into y
from agentComms in y.DefaultIfEmpty()
join kf in dbContext.KokuFee on ws.WalletSubscriptionId equals kf.WalletSubscriptionId into z
from kf_all in z.DefaultIfEmpty()
where ws.WalletType.Equals(WalletType.Agent) && !kf_all.IsDeleted && wd.WalletDetailId.Equals(agentWalletDetailId)
&& !agentComms.IsDeleted
select new AgentWalletResponse
{
Alias = ws.Alias,
Address = MapAddress(ci),
AgentSubscriptionId = ws.WalletSubscriptionId,
AgentWalletDetailId = wd.WalletDetailId,
SubscriptionNo = ws.SubscriptionNo,
Balance = wd.AvailableBalance,
CurrencyCode = wc.CurrencyCode,
Commission = agentComms == null ? 0 : agentComms.Commission,
TopupFee = kf_all == null ? 0 : kf_all.AbsoluteFee,
CreatedOn = wd.CreatedOn
}).FirstOrDefault();
//When use directly ef core fails to load the country of the address.
protected AddressModel MapAddress(CorporateInfo corporateInfo)
{
return MapAddress(corporateInfo.Address);
}
我想的是,当我在投影中请求 C.Address 时,它只是在查询生成时忽略了我的 ThenInclude 命令。