这让我很沮丧。我正在使用EntityFramework 6.1.2。这是奇怪的代码行:
var materialBt = prop.GetValue(material, null);
其中prop
是引用一对一关联的PropertyInfo
,material
是实体的DynamicProxies...
代理。 通过在 base 实体类型上调用prop
而不是DynamicProxy类型,可能与type.GetProperties
相关。< / strike>如果我从代理类中获得相应的PropertyInfo
,也会发生同样的事情,即material.GetType().GetProperty(prop.Name).GetValue(material, null)
也会返回null
。
我在此行之后立即设置断点。执行后,materialBt
为空。但是,如果我使用调试器检查material
,或通过立即窗口调用有问题的属性有一个值!prop.GetValue(material, null)
,
发生通常是。我观察到它有时会为 materialBt
返回正确的值,但是当我有一个断点进一步执行时,似乎会发生这种情况......所以也许它有“时间”来获取值呢?但这应该是原子的,不应该吗?
这是一个懒惰的装载物吗? 问题是 PropertyInfo
是从基础而不是代理类获得的吗?
进一步发挥作用,似乎只有当我通过调试器检查它时,通过将鼠标悬停在material
上并展开base
,才能正确返回该值。事实上,我发现,如果我在使用GUI检查器之前尝试了立即窗口,我就会在运行代码返回时获得null
。因此,调试器中的GUI检查器正在触发要填充的属性。
private async Task Merge (Type type, object ephemeral, object material)
{
PropertyInfo[] props = type.GetProperties();
foreach (PropertyInfo prop in props)
{
//...
if(IsModel(prop.PropertyType))
{
// A belongsTo relationship
--> var materialBt = prop.GetValue(material, null);
或者,如果你想要the full context...