如何通过流畅的api与下表联系起来?
我需要通过LinkTable
获取第二个表数据,其中存储了Main
和Second
个表的ID。
以下是我的模特:
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>
}
答案 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中,您可以找到有关如何加载不同级别的更多示例。