我有两个型号
public class Indicator
{
public long IndicatorID { get; set; }
public string Name { get; set; }
public int MaxPoint { get; set; }
public string Comment { get; set; }
public DateTime DateChanged { get; set; }
public DateTime DateCreated { get; set; }
public virtual IList<CalculationType> CalculationTypes { get; set; }
}
public class CalculationType
{
public long CalculationTypeID { get; set; }
public string UnitName { get; set; }
public int Point { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateChanged { get; set; }
public virtual Indicator Indicator { get; set; }
}
我有数据库工厂
public class DatabaseFactory
{
private StankinQuestionnaireEntities dataContext;
public StankinQuestionnaireEntities Get()
{
return dataContext ?? (dataContext = new StankinQuestionnaireEntities());
}
}
和引用databaseFactory
的属性protected StankinQuestionnaireEntities DataContext
{
get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
}
我使用Autofac和regiser DatabaseFactory
builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerRequest();
在我的存储库上我尝试以两种方式从导航属性获取数据
第一行工作正常(CalculationType包含一个元素)
但第二行在属性CalculationType
上返回null
为什么?
更新 我发现如果删除行&#34; .InstancePerRequest()&#34;,一切正常。但我不适合这个。
UPDATE2 由于某种原因,如果没有创建代理类
答案 0 :(得分:1)
您的数据库上下文肯定有不同的ProxyCreationEnabled属性值。
如果查看截图中拾取的实体的类型,可以看到第一个类型为System.Data.Entity.DynamicProxies.Indicator_E ...而第二个类型为StankinQuestionnaire.Model.Indicator。
这意味着对于第一个数据库上下文,ProxyCreationEnabled为true,而对于第二个数据库上下文,属性为false。因此,延迟加载在第二种情况下不起作用。
尝试搜索项目中设置了ProxyCreationEnabled的位置,可能您有多个位置。
答案 1 :(得分:0)
试试这个:
DbContext.Configuration.ProxyCreationEnabled = true;
DbContext.Configuration.LazyLoadingEnabled = true;
如果将DbContext.Configuration.ProxyCreationEnabled设置为false,则除非在父对象上调用Include方法,否则DbContext将不会加载某些父对象的子对象。将DbContext.Configuration.LazyLoadingEnabled设置为true或false将不会对其行为产生任何影响。
如果将DbContext.Configuration.ProxyCreationEnabled设置为true,则会自动加载子对象,并且DbContext.Configuration.LazyLoadingEnabled值将控制何时加载子对象。
我认为这篇文章与此相同:Why EF navigation property return null?
答案 2 :(得分:0)
我也遇到了同样的问题,在加载页面的第一时间它可以正常工作, 当我刷新页面时,我得到空引用异常。就我而言,我正在使用Task
System.Threading.Tasks.Task.Run(() =>
{
});
此任务使用Dbcontext插入一条记录。我只删除了Task,一切开始正常运行。