【问题标题】:EntityFramework 6 RC1 Include on Many-to-Many property failsEntityFramework 6 RC1 包含在多对多属性上失败
【发布时间】:2013-09-20 06:04:35
【问题描述】:

代理和代理组之间存在多对多关系(伪代码,缩写)。

public class Agent { 
    public virtual List<AgentGroup> AgentGroups { get; set; } 
}

public class AgentGroup { 
    public virtual List<Agent> Agents { get; set; } 
}

在代码中的某个时刻,我想获取所有 AgentGroups,并且我想预取/包含每个组的 Agents。我想在代理上预填充 AgentGroups 集合。这在 EF 6 beta 中有效,但在 EF 6 rc1 中不再有效:

List<AgentGroup> allGroups = context.AgentGroups.Include("Agents").Include("Agents.AgentGroups").ToList();

我得到的错误信息是

对象名称“dbo.AgentAgentGroups”无效。

而事实上,没有表AgentAgentGroups,表是dbo.AgentGroupAgents。关于让它再次工作的任何想法?

我目前没有注释,也没有使用 fluent API,这完全是默认的代码优先约定。

【问题讨论】:

  • 升级到 rc1 之前是否创建了数据库?当我尝试您的代码时,我看到了一个表AgentAgentGroups,但测试版创建了AgentGroupAgents。我想你在这里有一个独家新闻!
  • 初始模型没有 AgentGroups,而是使用 EF 6 beta 创建的。然后我添加了 AgentGroups 概念并使用 EF 6 rc1 创建了一个迁移。迁移将表创建为 AgentGroupAgents! CreateTable("dbo.AgentGroupAgents", etc
  • 这仍然在我的清单上,有一天我会深入研究迁移和动态生成数据库之间的区别。看起来查询生成器与后者共享代码。我之前看到过迁移生成的表似乎与查询中的表名不匹配的问题。坏消息。

标签: c# entity-framework entity-framework-6


【解决方案1】:

在 rc1 中,多对多关联中联结表的命名约定似乎发生了变化。当我在各种 EF 版本中尝试您的模型时,我看到的是:

  • EF5(稳定):AgentGroupAgents
  • EF6(测试版):AgentGroupAgents
  • EF6 (rc1): AgentAgentGroups

如果 beta 不同也不错,但是 rc1 与上一个 RTM 版本不同,这使得这是一个重大变化。好收获!

编辑

Answer from the EF team:

你好,
在 EF6 之前,模型创建的某些领域是不确定的 - 根据您是在 x86 还是 x64 上运行,您可以获得不同的模型。多对多连接表名就是这些领域之一。 在 EF6 中,我们解决了这个问题,以确保结果始终相同。不幸的是,这确实意味着对于某些模型(取决于它们所运行的架构)升级到 EF6 可能会导致模型更改。但是现在计算的模型将在机器和未来版本的 EF 中保持一致。 如果你想继续使用原来的名字,最好的选择是use the Fluent API to specify the join table name
~罗文

【讨论】:

  • 我在CodePlex提交了一个问题。
  • 我发现其他帖子表明命名约定已更改,因此我意识到了这一点,因此我有意重新创建了迁移。但无论出于何种原因,它都没有更新迁移中的表名。我已经降级到初始迁移,删除了 AgentGroups 迁移,创建了一个新的 AgentGroups 迁移,它又可以工作了。
  • 好的,很好。尽管如此,动态创建数据库(在应用程序的第一次运行时)显示了这些差异,因此存在问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多