Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架加载导航属性而不要求它们_C#_Entity Framework_Navigation Properties_Entity Model - Fatal编程技术网

C# 实体框架加载导航属性而不要求它们

C# 实体框架加载导航属性而不要求它们,c#,entity-framework,navigation-properties,entity-model,C#,Entity Framework,Navigation Properties,Entity Model,在一个项目中工作时,我看到了一个奇怪的行为,我无法理解导航属性的加载 这里有一个小例子再现了这个“问题” 我想加载一年,不包括公司的数据(导航属性) 我的代码: public static Year GetYear(int id) { using (var context = new testModelContainer()) { var result = context.YearSet.FirstOrDefault(c => c.Id == id);

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

这里有一个小例子再现了这个“问题”

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

我的代码:

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。

可能您已经启用了

尝试禁用它:

context.Configuration.LazyLoadingEnabled = false;

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


因此,如果您首先检索了
,然后检索了引用年实体的
公司
,其值为以前检索到的年,您的导航属性将自动更新,反之亦然-年份将填充公司属性。

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

下面是您的示例中发生的情况:


最初:

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

获取年份之后:

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

取回公司后的

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

获取另一家公司后

 Context:
 ****************************
 1) Year (Year.Company -> 2)  //Refers to second object in the context
 2) Company
 3) 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
  ****************************

在获取引用“另一家公司”的年份后



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

我已经检查过了,关闭懒散加载也没有帮助。我如何“清理”非手动包含的导航属性?我是否应该在不同的上下文中执行操作,然后在外部上下文中检索数据?@ BLACAI要么删除模型中的导航属性,要么使用两个上下文。@ BLACAI,请注意,如果手动更改该属性值(例如,将其设置为NULL),EF将视此为实体的更新。接下来,如果您调用SaveChanges,这些将被持久化到数据库中。好吧,在这种情况下,保存不是一个“真正”的问题,因为我们使用非常具体的函数将数据发送到服务,并且我不想保存的导航属性先前已被删除。