实体框架涉及第二个表

时间:2016-01-30 01:37:16

标签: asp.net-mvc entity-framework api fluent

如何通过流畅的api与下表联系起来?

我需要通过LinkTable获取第二个表数据,其中存储了MainSecond个表的ID。

enter image description here

以下是我的模特:

public class MainTable
{
        public int ID { get; set; }
        ...
        ...
        public ICollection<LinkTable> LinkTable { get; set; }
}

public class LinkTable
{
        public int ID { get; set; }
        ...
        ...
        public MainTable MainTable  { get; set; }
        public SecondTable SecondTable { get; set; }
}

public class SecondTable
{
        public int ID { get; set; }
        ...
        ...
        public ICollection<LinkTable> LinkTable { get; set; }
}

我这样映射:

HasRequired(t => t.MainTable).WithMany(t => t.LinkTable).HasForeignKey(t => t.MainTable_ID);
HasRequired(t => t.SecondTable).WithMany(t => t.LinkTable).HasForeignKey(t => t.SecondTable_ID);

试图获取数据:

MyDBContext.MainTable.Include("LinkTable").FirstOrDefault();

当我尝试使用LinkTable获取SecondTable数据时,我收到了错误消息:

  

未设置对象引用...

 @foreach (var item in Model.LinkTable)
 {
     <p>@item.SecondTable.ID</p>
 }

1 个答案:

答案 0 :(得分:1)

要避免该异常,您需要在构造函数中初始化导航属性:

public class MainTable
{

    public MainTable()
    {
      LinkTable=new List<LinkTable>();
    }
    public int ID { get; set; }
    ...
    ...
    public ICollection<LinkTable> LinkTable { get; set; }
}

此外,您可以使用强类型的Include扩展方法,可以避免可能的运行时异常:

MyDBContext.MainTable.Include(mt=>mt.LinkTable).FirstOrDefault();

现在,如果你想加载另一个级别,在这种情况下SecondTable,你可以这样做:

MyDBContext.MainTable.Include(mt=>mt.LinkTable.Select(lt=>lt.SecontTable)).FirstOrDefault();

在上面引用的link中,您可以找到有关如何加载不同级别的更多示例。