实体框架。外键引用项目不存在

时间:2016-11-03 06:05:30

标签: c# mysql asp.net entity-framework

我在导出到Excel文件时遇到空对象引用异常错误。 问题是一条记录在其他表中没有项目的数据库中有外来的。我无法更改数据库。

if (item.ShipperId != null)
     {         
         str.Append("<td><font face=Arial Narrow size=" + "14px" + ">" + item.Shipper.ShipperName + "" + "</font></td>");
     } 
     else
     {
         str.Append("<td><font face=Arial Narrow size=" + "14px" + ">" + "" + "</font></td>");
     }
}

ShipperId是外键,在这种情况下无效。

给出了例外
item.Shipper.ShipperName

我已经尝试检查它是否为空

if (item.Shipper.ShipperName != null)

但它也在此空检查上给出了异常

2 个答案:

答案 0 :(得分:1)

引用Shipper为空。而不是ShipperName

请检查if (item.Shipper != null)

答案 1 :(得分:0)

正如the answer Ashok M. Prajapati中所提到的,Shipper - 属性为null。但由于ShipperId不为空,这意味着托运人确实存在于数据库中。

  

ShipperId是外键,在这种情况下无效。

我不相信这种情况。由于它不为空,因此SQL Server将确保密钥存在于Shipper表中。由于foreign key is a constraint数据库不允许您删除项目,如果它有外键。因此,如果正确配置外键,您将永远不会拥有指向另一个表中的实际项目的键。

因此,您需要做的是在获取实体时包含,或者允许延迟加载

<强> 1。加载实体时获取。 通过使用Include,您可以获取导航属性。

var item = context.Items.Include(x => x.Shipper).FirstOrDefault();

<强> 2。使用延迟加载。 如果您仍然在上下文中,则可以使用延迟加载。像explained in MSDN

public class BloggingContext : DbContext 
{ 
    public BloggingContext() 
    { 
        this.Configuration.LazyLoadingEnabled = false; 
    } 
}