【问题标题】:Entity framework loads navigation properties without asking for them实体框架加载导航属性而不要求它们
【发布时间】:2014-04-28 12:51:21
【问题描述】:

在一个项目中工作时,我看到一个奇怪的行为,我无法理解加载导航属性。

这是一个重现这个“问题”的小例子。

我想加载年份,不包括公司的数据(导航属性)。

我的代码:

public static Year GetYear(int id)
{
    using (var context = new testModelContainer())
    {
        var result = context.YearSet.FirstOrDefault(c => c.Id == id);
        //Company test = context.CompanySet.Where(c => c.Id == id).FirstOrDefault();

        return result;
    }
}  

这将返回我想要的年份,导航属性中没有数据,但是如果我取消注释该行并执行该行,可能是因为我想知道公司名称或其他什么,它会自动包含公司数据进入年度公司导航属性。

知道如何防止这种行为吗?出于安全原因,我想避免发送“父母”的数据。

我正在使用 EF 6、.NET 4.5。

【问题讨论】:

    标签: c# entity-framework navigation-properties entity-model


    【解决方案1】:

    这是因为您在一个上下文中执行命令。如果在一个上下文中工作,实体会共享彼此的信息。

    因此,如果您首先检索了 Year,然后检索了 Company,该 Company 引用了具有先前检索到的 Year 值的 Year 实体,您的导航属性将自动更新,反之亦然 - Year 将具有 Company属性填充。

    【讨论】:

    • 我如何“清理”非手动包含的导航属性?我应该在不同的上下文中执行这些操作,然后在外部上下文中检索我的数据吗?
    • @blacai 要么删除模型中的导航属性,要么确实使用两个上下文。
    • @blacai,请注意,如果您手动更改该属性值(假设您将其设置为 null),EF 会将其视为实体的更新。接下来,如果您调用 SaveChanges,这些将被持久化到数据库中。
    • 好吧,在这种情况下,保存不是一个“真正的”问题,因为我们使用非常具体的函数将数据发送到服务,并且之前删除了我不想保存的导航属性。
    【解决方案2】:

    上下文是从持久性单元获取的所有数据的集合。

    所以在你的例子中发生了什么:


    Initially:

    Context:
    ****************************
    Empty.
    ****************************
    

    After Fetch Year:

    Context:
    ****************************
    1) Year (Year.Company -> null)
    ****************************
    

    After Fetch Company:

    Context:
    ****************************
    1) Year (Year.Company -> 2)  //Refers to second object in the context
    2) Company
    ****************************
    

    After Fetching another Company

     Context:
     ****************************
     1) Year (Year.Company -> 2)  //Refers to second object in the context
     2) Company
     3) Another Company
     ****************************
    

    After Fetching the year that refers to "Another Company"

      Context:
      ****************************
      1) Year (Year.Company -> 2)  //Refers to second object in the context
      2) Company
      3) Another Company
      4) Another Year (Year.Company -> 3) //Refers to third object in the context
      ****************************
    

    【讨论】:

      【解决方案3】:

      您可能启用了lazy loading

      尝试禁用它:

      context.Configuration.LazyLoadingEnabled = false;
      

      Disable lazy loading by default in Entity Framework 4

      【讨论】:

      • 我已经检查过了,关闭延迟加载没有帮助。
      【解决方案4】:

      只需在您的第一个实体上使用 .AsNoTracking() 即可。然后它不会跟踪实体,也不会加载您想要的实体。

      【讨论】:

        猜你喜欢
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多