5

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

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

在此处输入图像描述

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

我的代码:

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。

4

4 回答 4

3

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

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

于 2014-04-28T12:55:32.380 回答
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
  ****************************

于 2014-04-28T13:05:51.987 回答
0

可能您启用了延迟加载。

尝试禁用它:

context.Configuration.LazyLoadingEnabled = false;

在 Entity Framework 4 中默认禁用延迟加载

于 2014-04-28T12:53:56.373 回答
0

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

于 2021-03-10T17:50:35.670 回答