C# EF7中的多对多关系-选择包含相关数据的列表查询

C# EF7中的多对多关系-选择包含相关数据的列表查询,c#,entity-framework,asp.net-core,asp.net-core-mvc,entity-framework-core,C#,Entity Framework,Asp.net Core,Asp.net Core Mvc,Entity Framework Core,我正在建立一个博客,在content->category表上有以下多对多关系。我已使用以下代码在EF7中生成表: public class Category { public int Id { get; set; } public string Name { get; set; } public virtual ICollection<Categorization> Categorization { get; set; } } public class C

我正在建立一个博客,在content->category表上有以下多对多关系。我已使用以下代码在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; }
}
这是调用它时得到的错误页面

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

AggregateException:发生了一个或多个错误。聚合异常: 发生了一个或多个错误。AggregateException:一个或多个错误 发生。AggregateException:发生了一个或多个错误。 SqlException:列名“Id”无效。有一个待定的模型 ApplicationDbContext的更改为这些应用程序构建了新的迁移 更改并从命令行将其应用于数据库:

dnx ef migrations add [migration name] 
dnx ef database update
有趣的提示:当我删除该行时

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

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

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

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

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

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

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

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

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

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

使用Include通常是一个不好的adiea,因为它对性能的影响相当大。如果您有10个类别、10个分类和10个内容,您将从数据库中检索1000(10*10*10)行。在3个单独的调用中获取它们时,您只能检索30(10+10+10)行。当然,我理解include的开销,我只是用它来解决关系的问题。我只是用它来获取所有类别的列表,以及每个类别中内容的关联计数。是否有一个干净的方法来实现这一点,可能是计数的计算列?假设[Categorization.ContentId,Categorization.Categorid]是唯一的
await\u db.Categories.Select(c=>new{c.Id,ContentCount=c.Categorization.count()}.ToDictionaryAsync(c=>c.Id,c=>c.ContentCount).ConfigureAwait(false)
太棒了!你启发了我最终的解决方案。我创建了一个新的POCO类来包含计数和类别,然后简单地运行一个select来整理我的列表。如下所示:categories=wait _db.categories.select(c=>newcategoryapi{category=c,count=c.Categorization.count})。ToListAsync()唉!现在加载此行时仍然收到SqlException:列名“Id”无效。我已经更新了模型,并多次迁移了数据库。此外,系统不断检测到模型发生了更改,当添加迁移时,它会生成与上一次迁移完全相同的迁移代码,然后仍然认为有变化。奇怪!使用Include通常是一个糟糕的adiea,因为对性能的影响相当大。如果您有10个类别、10个分类和10个内容,您将从数据库中检索1000(10*10*10)行。在3个单独的调用中获取它们时,您将只检索30(10+10+10)行。当然,我理解include的开销,我只是用它来解决关系的问题。我只是用它来获取所有类别的列表,以及每个类别中内容的关联计数。有没有一种干净的方法来实现这一点,或者是为计数计算一列?假设[Categorization.ContentId,Categorization.CategoryId]是唯一的
await\u db.Categories.Select(c=>new{c.Id,ContentCount=c.Categorization.Count()}.ToDictionaryAsync(c=>c.Id,c=>c.ContentCount).ConfigureAwait(false)
太棒了!你启发了我最终的解决方案。我创建了一个新的POCO类来包含计数和类别,然后简单地运行一个select来整理我的列表。如下所示:categories=wait _db.categories.select(c=>newcategoryapi{category=c,count=c.Categorization.count})。ToListAsync()唉!现在加载此行时仍然收到SqlException:列名“Id”无效。我已经更新了模型,并多次迁移了数据库。此外,系统不断检测到模型发生了更改,当添加迁移时,它会生成与上一次迁移完全相同的迁移代码,然后仍然认为有变化。奇怪!我正在使用迁移,并且数据库在我的代码中与迁移是最新的,模型似乎有问题,因为它不断地认为模型上有悬而未决的变化,而这些变化在迁移中并不存在。我反复运行迁移命令,它只是生成完全相同的结果迁移代码,并一次又一次地应用相同的更改,之后仍然认为我的模型中有更改。我正在使用迁移,并且数据库在代码中的迁移是最新的,模型似乎有问题,因为它一直认为模型上有挂起的更改,而这在迁移中不存在我已经多次运行迁移命令,它只是生成完全相同的迁移代码,并一遍又一遍地应用相同的更改,之后仍然认为我的模型发生了更改。