【问题标题】:How to use twice a reference to another table?如何使用两次对另一个表的引用?
【发布时间】:2018-01-08 12:35:46
【问题描述】:

考虑以下类:

public class Unidade
{
    public int UnidadeId { get; set; }
    public string Apelido { get; set; }
    public string Descricao { get; set; }
}

public class Estrutura
{
    public int Id { get; set; }
    …
    public int UnidadeId { get; set; }
    public virtual Unidade Unidade { get; set; }
    …
    public int UnidadeCompraId { get; set; }
    public virtual Unidade UnidadeCompra { get; set; }
    …
  }

查询 Estruturas.Single(e => e.Id == 120898).Unidade.Descricao 会返回错误,实际上是因为 Estruturas.Single(e => e.Id == 120898).Unidade 为空。

此示例中使用的 Id (120898) 有效,因为设置了有效的 UnidadeId 值。

怎么了?如何获得具有有效 Estrura 的 Descricao 的价值?

【问题讨论】:

  • 您可以尝试预先加载 (Estruturas.Include(e => e.Unidade.Single(e => e.Id == 120898).Unidade.Descricao) 尽管您的导航属性设置为延迟加载并且代码应该按原样工作(除非存在模型配置问题或延迟加载/代理创建是为上下文禁用)。有流畅的配置吗?
  • 实际上这个问题第一次出现在 MVC 急切加载中,我简化了它,在这里隔离了 EF 模式......它不会工作
  • 如果你有 null 值然后将 int 更改为 int?
  • 我没有空值,这就是问题所在......

标签: c# .net sql-server database entity-framework


【解决方案1】:

在 C# 6 中:

struturas.Single(e => e.Id == 120898).Unidade?.Descricao

如果Unidade 为空,您将生成空

【讨论】:

  • 问题是它不应该为空......有一个UnidadeId,因此应该有一个Unidade......
【解决方案2】:

问题是您关闭了延迟加载。虽然这可能更好。那么问题是您需要在调用 .Single 之前 .Include ,否则它不会获取其他表数据。

编辑

该表或此其他表的外键要么根本没有定义,要么设置在错误的列上。因此,它最终会尝试链接错误的 2 条数据,而您最终会在那里找不到任何数据。

一个简单的测试方法就是这样做:

 string sql = Estruturas.Where(e => e.Id == 120898).Include(a => a.Unidade).ToString();

这将显示 EF 将运行的 SQL,减去实际参数值。确保这显示了您期望它的外观。您甚至可以直接在 Sql Server 中运行此查询,并填写参数以确保您也能取回数据。

此外,您必须在某处为表格定义 [Key]。外键设置假定它只链接回另一个表的 PK。

【讨论】:

  • 我在 LinqPad 中生成的这个例子只是为了在这里发布。真正的问题发生在延迟加载的 MVC 应用程序中,并且控制器具有必要的“包含”...
  • 你能发布你的模型类和控制器示例吗?
  • 公共类 Unidade { public int UnidadeId { get;放; } [StringLength(2)] [Display(Name = "Unidade")] public string Apelido { get;放; } [StringLength(16)] [Display(Name = "Descrição")] public string Descricao { get;放; } }
  • 我没有空间用于类,但控制器是: public ActionResult Index() { var estruturas = db.Estruturas .Include(e => e.Produto) .Include(e => e. Sequencia) .Include(e => e.Unidade) .Include(e => e.UnidadeCompra);返回视图(esttruturas.ToList()); }
  • 等等,如果你的外键被定义了怎么办?
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多