【问题标题】:Entity Framework. Foreign key references item that doesn't exist实体框架。外键引用不存在的项目
【发布时间】:2017-03-16 15:29:08
【问题描述】:

导出到 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)

但它也对这个空检查给出了异常

【问题讨论】:

  • if(item.ShipperId>0){ 这里是代码}

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


【解决方案1】:

引用Shipper 为空。而不是ShipperName

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

【讨论】:

    【解决方案2】:

    正如the answerAshok M. Prajapati 中所述,您的Shipper-属性是null。但由于ShipperId 不为null,这意味着Shipper 确实存在于数据库中。

    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; 
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多