所以基本的类结构是这样的
public class PersonalizationCatalogPrice { public int PersonalizationCatalogPriceID { get; set; } public int PersonalizationCatalogId { get; set; } public virtual PersonalizationCatalog PersonalizationCatalog { get; set; } public decimal CustomerRetail { get; set; } public decimal ConsultantCost { get; set; } public decimal PersonalVolume { get; set; } public decimal QualifyingVolume { get; set; } public int PriceLevelId { get; set; } public PriceLevel PriceLevel { get; set; } }
这是一个例子.在第一行中,我们返回Iqueryable of PersonalizationCatalogPrice项.在第二行中,我们有另一个IQueryable,我们在这个iQueryable中使用了priclevel对象(参见“contains pcp.pricelevel”行).当我们这样做时,即使没有虚拟关键字,pricelevel对象也会加载.
IQueryable<PersonalizationCatalogPrice> allPersPriceRecords = _e2ReposMan.PersonalizationRepository.GetSomeRecords(); //List<PersonalizationCatalogPrice> persprices = allPersPriceRecords.ToList(); var persQuery = from pl in personalizationLines join pcp in allPersPriceRecords on pl.Item2.PersonalizationCatalogPriceID equals pcp.PersonalizationCatalogPriceID where !HostesspriceLevelTypes().Contains(pcp.PriceLevel.PriceLevelTypeId) select pl.Item2.PersonalVolume * pl.Item1; var openordersTotal = (query.Any() ? query.Sum() : 0) + (persQuery.Any() ? persQuery.Sum() : 0);
通过取消注释执行ToList()的第二行来修改此代码.使pricelevel子对象按预期返回null,因为它上面没有虚拟关键字,然后实体框架按预期工作. (EF 6)
有没有人知道我们为什么能够在不执行toList()时加载pricelevel属性.
谢谢你的帮助.
解决方法
在某些情况下我可以想到,这种期望不会得到满足.
第一种情况是,如果您以急切的方式加载数据.哪个将明确使用Include().此行为也称为急切加载.由于急切加载确实加载了允许的所有内容,因此不需要通过调用ToArray()或ToList()或其他触发枚举的方法来枚举集合.
将加载每个非延迟属性,包括其所有值类型属性和非延迟属性.
您的代码不会指明这一点,但是如果您在执行显示的代码之前在同一个DbContext派生实例上执行此操作,则该属性仍然不为null.只要有问题的实体已经在您的DbContext中缓存,就会发生这种情况.
如果您通过调用Load()显式加载了该实体,或者它是从其他先前的查询返回的,那么情况也是如此.
为了验证是否是这种情况,您可以使用AsNoTracking()扩展方法.除了其他效果之外,未跟踪的实体将不会彼此链接.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。