C# 实体数据模型关联和MVC 1.NET在关联对象上提供NULL,但允许Linq对实体进行筛选
我有一个从SQL2005Express数据库生成的EDM向导。例如,我有一个名为Projects的表,它与名为People的表有关系。项目在人员表主键上有两种关系,作为人员表中的外键(ChamipionID和LeaderID) 我已经清理了实体、实体集和关联的所有名称,并验证了关联映射是我所期望的 当我针对此编写Linq to Entities查询时,在MVC 1网站的视图模型中,将LeaderID映射到数据类型为int64(long)的PeopleID的关联“Leader”始终返回为null 比如说C# 实体数据模型关联和MVC 1.NET在关联对象上提供NULL,但允许Linq对实体进行筛选,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,我有一个从SQL2005Express数据库生成的EDM向导。例如,我有一个名为Projects的表,它与名为People的表有关系。项目在人员表主键上有两种关系,作为人员表中的外键(ChamipionID和LeaderID) 我已经清理了实体、实体集和关联的所有名称,并验证了关联映射是我所期望的 当我针对此编写Linq to Entities查询时,在MVC 1网站的视图模型中,将LeaderID映射到数据类型为int64(long)的PeopleID的关联“Leader”始终返回为null
var object = (from p in _entities.Projects
where p.Leader.PeopleID == 1
select p);
object.Leader始终为yeilds null,即使关联允许正确进行筛选,并且项目数据都在那里
即使我这样写查询
var object = (from p in _entities.Projects
from pe in _entities.PeopleSet
where pe.PeopleID == 1
select p);
结果是一样的
有人知道为什么会这样吗?我缺少什么?EF 1将永远不会加载相关类型,除非您强制它 我强烈建议您将视图与实体类型分离。然后,可以通过投影强制加载正确的特性(并且仅加载正确的特性):
var object = (from p in _entities.Projects
where p.Leader.PeopleID == 1
select new ViewModel
{
ProjectName = p.Name,
LeaderName = p.Leader.Name
});
现在,将加载领导信息,并且您的视图处于持久性状态。您也可以在访问对象时执行此操作: 如果(!entity.Project.IsLoaded) entity.Project.Load()
作为另一种选择,这显然不在查询级别。这就是我现在正在做的,但感觉像是一种解决方法。我认为EF的美妙之处在于,您可以以这种方式使用EDM,而不必将实体包装在自定义类中。视图通过使用存储库模式进行解耦。所以,听起来EF1不会做(我认为)它应该做的事情。你知道它是否在工作中,因为不必为大多数较小的东西围绕模型构建模型会很好。我同意,对于不希望访问所有属性的更复杂视图,封装一个单独的ViewModel类是一种方法。如果使用
\u entities.Projects.Include(“Leader”)
,即使在EF 1中也可以按要求执行。然而,我认为使用持久性无关视图是一个更好的解决方案。谢谢我得仔细阅读你的观点,小心点。关于这个主题的大部分内容都是为旧版ORMs设计的,在旧版ORMs中,代理类型伪装成poco。正如上面的投影示例所示,真正的持久性无知是不同的。对于理解它们的人来说,代理并没有什么大不了的,但是人们在持久性主题上写的很多东西都假定必须映射POCO才能拥有它,这只有在ORM中没有投影时才是正确的。阅读“演示模型”可能会更有帮助,它更接近这里的要点。