【问题标题】:Foreign key relationships in Entity Framework v.1Entity Framework v.1 中的外键关系
【发布时间】:2010-06-15 08:02:25
【问题描述】:

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

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

在 4.0 版本中可以使用,但在 v.1 中不起作用。 "Visits" 的计数为 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 循环遍历用户,这没问题,但内部循环永远不会进入,因为没有返回访问。同样,在 Framework 4.0 中它工作正常,使用相同的数据库。

那怎么了?

【问题讨论】:

    标签: linq entity-framework foreign-key-relationship


    【解决方案1】:

    只需将您的代码更改为:

    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"; 
        } 
    } 
    

    注意告诉 EF 急切加载每个用户的访问的 Include(...)。

    有了它,它应该可以工作了。

    其实如果网页也是导航,你可能需要:

    Include("Visits.Webpage");
    

    希望这可行

    【讨论】:

    • 太棒了!效果很好,谢谢!只是几个问题:为什么这是必要的?在 Linq to Sql 中没有必要,在 v.4.0 中也没有,所以这是在 4.0 中纠正的缺点还是这个“包含”的目的是什么?此外,在导航这样的数据模型时,需要遍历许多步骤(“点”)才能获得所需的对象。我在想最少知识的原则,或者说你应该避免这种情况的“得墨忒耳法则”。这是一个问题吗?否则我不知道该怎么做......(我问是因为我试图了解更多关于设计原则的信息)。
    • 在 L2S 中,当您访问导航时,它会静默加载 - 也就是延迟加载。至于得墨忒耳法则,我还没有看到允许您折叠导航以避免这种违规行为的 ORM。即 x.YZ 而不是 x.Y.Z
    • 当您提前知道您将需要一些数据时,您使用 Include - 延迟加载 - 当您拉回大量结果时很有用,并且可能只需要来自少数结果的相关项目。 IE。提前撤回所有数据是一种浪费。
    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多