【发布时间】: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 => new {c.Id, ContentCount = c.Categorization.Count()}.ToDictionaryAsync(c => c.Id, c => 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