我目前正在使用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>
关键字有关,或者这是否与这两者的映射出错?
答案 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会认为它本身很重要,并使其成为一个明确的实体。