2017-05-30 96 views
1

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

一个例子可能是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>只是空。

这是否即使有什么从我的财产与我removingthe virtual关键字,或者是这个东西是了问题两者的映射?

+0

您需要加入表格。看到msdn:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng

+0

但我不能。我有三个表格,其中2个包含在我的模型中,但最后一个表格不是,它包含关系,因为它是多对多的关系。我很确定我不能像这样加入,除非你能向我展示一个例子吗? – Detilium

+0

请在请在SO发布问题之前做一些研究。有很多例子做很多很多,他们几个是 - 1)http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx 2)https://stackoverflow.com/questions/19342908/how-to-create-a-many-to-many-mapping-in-entity-framework 3)https://stackoverflow.com/questions/5434125/实体框架 - codefirst一对多一对多的关系,与附加信息前 –

回答

0

由于您的表3只包含Ids并且没有额外信息,因此EF不会为联接表生成实体。这是正确的行为,这就是你应该期待的。

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

+0

我知道,EF不创建中间表,但我不明白为什么我不能包括第二张桌子。这个答案并没有真正回答我的问题,只是解释了为什么中间表没有在我的EDMX模型 – Detilium

0

解决

我有几分像这样的查询:

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

对我来说实际上包括t1Table2财产,我可以简单地做一个新的select语句,像这样:

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

我不确定这是否最好p ractice,但至少它按我的预期工作。提出更好的解决方案是值得欢迎的。

+1

哪里是第三台存在吗? – jdweng

+0

这由EF自动映射,第三个表格不在EDMX模型中。这实际上适用于所有关系,即使它是多对多关系或多对一的简单关系 – Detilium

0

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