实体框架6在检索数据时未识别一对多关系

时间:2016-04-12 15:19:46

标签: c# .net entity-framework entity-framework-6

当我插入我的对象时,他们会识别出它们是一对多的,并且外键正确放置在许多边表中。 当我检索我的对象时,他们无法识别单侧表上的一对多,因此我无法访问许多侧对象的ICollection。特别是在尝试访问集合

时会抛出Null Reference Exception

在下面的解释中,事件是一方而干扰是多方面。事件与许多干扰相关联,但干扰只是一个事件的一部分。

免责声明:由于一些项目限制和一些模块构建在其他模块之上,我们在DAL中使用实体框架,并且模型交叉切割业务/数据。这可能会影响到这个问题。我知道这不是理想的,但这就是我们所处的地方,我还没有看到任何明确表示你不能像这样使用EF的东西。

我的事件定义如下:

public class Incident
{
    public Incident()
    {

    }

    public Incident(List<Disturbance> sortedDisturbances)
    {
        StartTime = sortedDisturbances[0].StartTime;
        Disturbances = new List<Disturbance>(sortedDisturbances);
    }

    [Key]
    public int IncidentID { get; set; }

    public virtual ICollection<Disturbance> Disturbances { get; set; }

    [Column(TypeName="datetime2")]
    public DateTime? StartTime { get; set; }
}

我必须添加一个无参数构造函数来处理因实体框架试图在某些区域使用无参数构造函数而导致的错误。

我的骚扰定义如下:

public class Disturbance : IComparable<Disturbance>
{
    [Key]
    public int DisturbanceID { get; set; }

    [Column(TypeName = "datetime2")]
    public DateTime StartTime { get; set; }

    [Column(TypeName = "datetime2")]
    public DateTime EndTime { get; set; }

    public int CompareTo(Disturbance other)
    {
        if (this.StartTime < other.StartTime)
            return 1;
        if (this.StartTime > other.StartTime)
            return -1;
        return 0;
    }
}

我还没有读过任何说过实现接口会破坏实体框架中任何内容的东西,所以我就这么做了。

这是我添加事件的方式:

业务层:

private void MakeIncident(List<Disturbance> DisturbancesToAggregate)
{
    Incident incidentToInsert = new Incident(DisturbancesToAggregate);
    _iDAL.InsertIncident(incidentToInsert);
}

数据层:

public void InsertIncident(Incident incidentToInsert)
{
    using (var context = new InternalContext())
    {
        context.Incident.Add(incidentToInsert);                                                         
        context.SaveChanges();
    }
}

问题是当我访问我的事件时:

public IEnumerable<DomainModel.Disturbance> GetProcessedDisturbances()
{
    List<DomainModel.Disturbance> processedDisturbances = new List<DomainModel.Disturbance>();
    using(var context = new InternalContext())
    {
        foreach(var i in context.Incident)
        {
            foreach(var d in i.Disturbances)
            {
                processedDisturbances.Add(d);
            }
        }
    }
    return processedDisturbances;
}

i.Disturbances集合导致空参考例外。有什么我需要调用来强制上下文来获得干扰吗?我做了一些明显的错误吗?

我的想法(我不喜欢他们中的任何一个并且不想做他们中的任何一个): 1.明确地将IncidentID放在Disturbance表上(甚至不确定这是否有效) 2.强制查找表通过向障碍添加事件的ICollection(它不是多对多的关系,我认为这将阻止我能够清除事件中的所有干扰) 3.在创建模型时明确定义关系。 (我不喜欢必须这样做的想法,而且我认为EF在那里是一半,因为它正确插入。

1 个答案:

答案 0 :(得分:1)

由于EF中的延迟加载而发生这种情况。我们需要急切地加载数据。要了解有关它们的更多信息,请参阅以下链接。

https://msdn.microsoft.com/en-in/data/jj574232.aspx