Linq 实体框架v.1中的外键关系

Linq 实体框架v.1中的外键关系,linq,entity-framework,foreign-key-relationship,Linq,Entity Framework,Foreign Key Relationship,我需要在EF版本1中创建实体数据模型,因为我的web主机还没有Framework4.0。下面只是一个简单的例子来说明这个问题 我有3个表,一个用户表,另一个网页表和一个访问表。前两个表都与vists表有一对多关系(基本上是多对多关系,只有vists表有自己的主键和额外字段) 在4.0版本中,这是可行的,但在v.1中却不行。“访问”的计数为0,因此测试字符串返回“”。。。为什么,以及如何访问v.1中的外键关系 UsersEntities context = new UsersEntities();

我需要在EF版本1中创建实体数据模型,因为我的web主机还没有Framework4.0。下面只是一个简单的例子来说明这个问题

我有3个表,一个用户表,另一个网页表和一个访问表。前两个表都与vists表有一对多关系(基本上是多对多关系,只有vists表有自己的主键和额外字段)

在4.0版本中,这是可行的,但在v.1中却不行。“访问”的计数为0,因此测试字符串返回“”。。。为什么,以及如何访问v.1中的外键关系

UsersEntities context = new UsersEntities();
var users = context.Users;
string result = "";
foreach (var user in users)
{
    foreach (var visit in user.Visits)
    {
        result += visit.Webpage.Url + "\n";
    }
}
所以foreach循环通过用户循环,这是可以的,但是内部循环永远不会进入,因为没有返回访问。同样,在Framework4.0中,使用相同的数据库,它工作得很好


有什么问题吗?

只需将代码更改为:

UsersEntities context = new UsersEntities(); 
var users = context.Users.Include("Visits"); 
string result = ""; 
foreach (var user in users) 
{ 
    foreach (var visit in user.Visits) 
    { 
        result += visit.Webpage.Url + "\n"; 
    } 
} 
注意Include(…)告诉EF急切地加载每个用户的访问

有了这一点,它应该会起作用

实际上,如果网页也是一个导航,您可能需要:

Include("Visits.Webpage");

希望这能奏效

太棒了!非常好用,谢谢!只是几个问题:为什么这是必要的?这在LINQtoSQL中是不必要的,在v.4.0中也是不必要的,所以这是在4.0中纠正的一个缺点,还是这个“包含”的目的是什么?此外,在这样导航数据模型时,需要遍历许多步骤(“点”),以获得所需的对象。我在考虑最少知识的原则,或者说“得墨忒尔定律”,它说你应该避免这种情况。这是个问题吗?我不知道怎么做,否则。。。(我这样问是因为我试图学习更多关于设计原则的知识)。在L2S中,当你访问导航时,它是无声加载的,也就是懒散加载。至于德米特定律,我还没有看到一个ORM允许你折叠导航以避免这种违反。i、 e.x.YZ而不是x.Y.zy当您事先知道需要一些数据时使用Include-懒散加载-在您提取大量结果时非常有用,并且可能只需要从少数结果中提取相关项。也就是说,提前收回所有数据是一种浪费。