LINQ多对多选择

时间:2017-05-30 06:15:53

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

我目前正在使用EF数据库第一种方法创建MVC / AngularJS应用程序。在实现我的数据库之后,我意识到我不能使用Database-First方法来引用多对多关系。

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

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

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

virtual

from t1 in _context.Table1.Include(x => x.Table2) 引用不包含在内,因此Table2只是空。

这是否与我从我的属性中删除Icollection<Table2>关键字有关,或者这是否与这两者的映射出错?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

<强>解决

我的查询有点像这样:

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

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

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

我不确定这是否是最佳做法,但至少它对我来说是预期的。建议寻求更好的解决方案。

答案 2 :(得分:0)

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