【问题标题】:Many-to-Many Relationships in EF7 - Select query for a list including related dataEF7 中的多对多关系 - 选择查询以获取包含相关数据的列表
【发布时间】:2016-05-11 02:59:44
【问题描述】:

我正在构建一个博客,它在内容 -> 类别表上具有以下多对多关系。我使用以下代码在 EF7 中生成表:

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Categorization> Categorization { get; set; }
}

public class Categorization
{
    public int ContentId { get; set; }
    public Content Content { get; set; }

    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

public class Content
{
    [Key]
    public int Id { get; set; }
    public string Title { get; set; }
    public string Excerpt { get; set; }
    public string Body { get; set; }

    ...

    public virtual ICollection<Categorization> Categorization { get; set; }
}

但是,当我尝试加载类别列表时,包括与 EF7 查询关联的内容,如下所示。

categories = await _db.Categories
                      .Include(c => c.Categorization)
                      .ThenInclude(c => c.Content)
                      .OrderByDescending(c => c.Categorization.Count)
                      .ToListAsync();

这是我调用它时得到的错误页面。

处理请求时数据库操作失败。

AggregateException:发生一个或多个错误。聚合异常: 发生一个或多个错误。 AggregateException:一个或多个错误 发生了。 AggregateException:发生一个或多个错误。 SqlException:列名“Id”无效。有待定型号 ApplicationDbContext Scaffold 的更改为这些 更改并将它们从命令行应用到数据库:

dnx ef migrations add [migration name] 
dnx ef database update

有趣的注释:当我删除线时

 .Include(c => c.Categorization).ThenInclude(c => c.Content)

它有时会正常工作,如加载分类,但这并不总是发生,有时分类不加载,我在生成的枚举中的每个 Category 类中只有空引用。

【问题讨论】:

  • 使用 Include 通常是个坏事,因为它对性能的影响非常大。如果您有 10 个类别、10 个分类和 10 个内容,您将从数据库中检索 1000 (10*10*10) 行。在 3 个单独的调用中获取它们时,您只会检索 30 (10+10+10) 行。
  • 当然,我理解包含的开销,我只是用它来找出关系的问题。我只使用它来获取所有类别的列表,以及每个类别中内容的相关计数。有没有一种干净的方法可以做到这一点,也许是计数的计算列?
  • 假设 [Categorization.ContentId, Categorization.CategoryId] 是唯一的await _db.Categories.Select(c =&gt; new {c.Id, ContentCount = c.Categorization.Count()}.ToDictionaryAsync(c =&gt; c.Id, c =&gt; c.ContentCount).ConfigureAwait(false)
  • 太棒了!你启发了我最终的解决方案。我创建了一个新的 POCO 类来包含计数和类别,然后简单地运行一个选择来填充我的列表。如下: categories = await _db.Categories.Select(c => new CategoryApi { Category = c, Count = c.Categorization.Count }).ToListAsync()
  • 唉!现在加载此行时仍然收到 SqlException: Invalid column name 'Id'。我已经更新了模型并多次迁移了数据库。此外,系统不断检测到模型发生了变化,当添加迁移时,它会生成与之前迁移完全相同的迁移代码,然后仍然认为有变化。奇怪!

标签: c# entity-framework asp.net-core asp.net-core-mvc entity-framework-core


【解决方案1】:

错误信息说明了一切。 SqlException:列名“Id”无效

您的数据库与项目中的模型不同。如果您启用了数据库迁移,则运行命令

dnx ef migrations add [migration name] 
dnx ef database update

如果您不想使用数据库迁移,则必须更新数据库上的模型以匹配您的模型。

【讨论】:

  • 我正在使用迁移,并且数据库与我的代码中的迁移是最新的,模型似乎有问题,因为它一直认为模型有待更改,即迁移中不存在。我反复运行了迁移命令,它只是生成完全相同的迁移代码,并一遍又一遍地应用相同的更改,但之后仍然认为我的模型有变化。
猜你喜欢
  • 2021-10-30
  • 1970-01-01
  • 2018-11-19
  • 2013-09-28
  • 2017-06-29
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多