【问题标题】:LINQ many-to-many selectLINQ 多对多选择
【发布时间】:2017-05-30 06:15:52
【问题描述】:

我目前正在使用 EF 数据库优先方法创建一个 MVC / AngularJS 应用程序。实现我的数据库后,我意识到我无法使用 Database-First 方法引用多对多关系。

例如,Table1 通过名为Table3 的第三个表与Table2 具有多对多关系。 Table3 包含两个主键:Table1 的 PK 和 Table2 的 PK。更新我的 EDMX 模型,我仍然无法添加这个表,这是有道理的,因为它只是一个多对多关系,并且这个属性应该在 Table1 类模型和 Table2 类上设置。

问题
使用 AngularJS 作为我的前端,我需要将从数据库中检索的数据转换为 HttpResponse (IHttpActionResult)。我以前遇到过这样的问题(使用代码优先)并且只是禁用了延迟加载(从我的 EMDX 模型类的属性中删除了virtual 关键字)。

禁用延迟加载后,我似乎无法包含该关系。这是我的意思的一个例子:

from t1 in _context.Table1.Include(x => x.Table2)

Table2 引用根本不包括在内,因此 Icollection<Table2> 只是空值。

这是否与我从我的属性中删除 virtual 关键字有关,或者这两者的映射出了什么问题?

【问题讨论】:

标签: c# sql-server asp.net-mvc entity-framework linq


【解决方案1】:

由于您的 Table3 仅包含 Id 而没有额外信息,因此 EF 不会为连接表生成实体。这是正确的行为,也是您应该期待的。

查看此答案以获取更多信息。 Entity Framework Database First many-to-many

【讨论】:

  • 我知道 EF 不会创建中间表,但我不明白为什么我不能包含第二个表。这个答案并没有真正回答我的问题,只是解释了为什么我的 EDMX 模型中不存在中间表
【解决方案2】:

已解决

我有一个类似这样的查询:

from t1 in _context.Table1
select new SomeModel() 
{
    Table1 = t1,
    Table2 = t1.Table2
}

为了让我在t1 上实际包含Table2 属性,我可以简单地执行一个新的选择语句,如下所示:

from t1 in _context.Table1
select new SomeModel() 
{
    Table1 = t1,
    Table2 = from t2 in t1.Table2 select t2
}

我不确定这是否是最佳做法,但至少它对我来说按预期工作。非常欢迎提出更好的解决方案。

【讨论】:

  • 第三张桌子在哪里?
  • 这个是EF自动映射的,第三个表不在EDMX模型中。这实际上适用于所有关系,即使它是多对多关系或简单的多对一
【解决方案3】:

我发现的最简单的解决方案是仅在连接表中添加一个虚拟的第三列。有了这个,EF 会认为它本身很重要,并使其成为一个明确的实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    相关资源
    最近更新 更多