Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体数据模型关联和MVC 1.NET在关联对象上提供NULL,但允许Linq对实体进行筛选_C#_Entity Framework_Linq To Entities - Fatal编程技术网

C# 实体数据模型关联和MVC 1.NET在关联对象上提供NULL,但允许Linq对实体进行筛选

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

我有一个从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中没有投影时才是正确的。阅读“演示模型”可能会更有帮助,它更接近这里的要点。