为什么导航有时会返回null?

时间:2015-03-28 12:25:22

标签: c# asp.net asp.net-mvc entity-framework autofac

我有两个型号

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();

在我的存储库上我尝试以两种方式从导航属性获取数据

enter image description here

第一行工作正常(CalculationType包含一个元素)

enter image description here

但第二行在属性CalculationType

上返回null

enter image description here

为什么?

更新 我发现如果删除行&#34; .InstancePerRequest()&#34;,一切正常。但我不适合这个。

UPDATE2 由于某种原因,如果没有创建代理类

3 个答案:

答案 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,一切开始正常运行。