Linq 实体框架v.1中的外键关系
我需要在EF版本1中创建实体数据模型,因为我的web主机还没有Framework4.0。下面只是一个简单的例子来说明这个问题 我有3个表,一个用户表,另一个网页表和一个访问表。前两个表都与vists表有一对多关系(基本上是多对多关系,只有vists表有自己的主键和额外字段) 在4.0版本中,这是可行的,但在v.1中却不行。“访问”的计数为0,因此测试字符串返回“”。。。为什么,以及如何访问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();
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-懒散加载-在您提取大量结果时非常有用,并且可能只需要从少数结果中提取相关项。也就是说,提前收回所有数据是一种浪费。