Entity framework 实体框架-通过导航属性添加新项

Entity framework 实体框架-通过导航属性添加新项,entity-framework,navigation,properties,Entity Framework,Navigation,Properties,我在使用EntityFramework4.0时遇到了一种非常奇特的行为 我有一个用户实体,它有一个公司(一个公司有许多用户) 如果我这样做,一切都会按预期进行,我会在数据库中找到一个漂亮闪亮的新用户: var company = _model.Companies.First(); company.Users.Add(new User(1, "John", "Smith")); _model.SaveChanges(); 但是,如果我这样做,那么我在数据库中不会得到任何新信息,也不会引发异常:

我在使用EntityFramework4.0时遇到了一种非常奇特的行为

我有一个用户实体,它有一个公司(一个公司有许多用户)

如果我这样做,一切都会按预期进行,我会在数据库中找到一个漂亮闪亮的新用户:

var company = _model.Companies.First();
company.Users.Add(new User(1, "John", "Smith"));
_model.SaveChanges();
但是,如果我这样做,那么我在数据库中不会得到任何新信息,也不会引发异常:

var existingUser = _model.Users.First();
var company = existingUser.Company;
company.Users.Add(new User(1, "John", "Smith"));
_model.SaveChanges();
因此,如果我向直接从模型中提取的公司添加一个用户,那么一切都正常。但是,如果用户被添加到作为另一个对象的导航属性拉入的公司,那么它将不起作用

有人能告诉我这是否是预期的行为,或者我能做些什么使它成为预期的行为吗

谢谢

编辑 澄清我所说的“它不起作用”的意思

  • 单步执行代码显示执行指针经过所有行而不引发异常
  • 未向数据库中添加新行
  • 如果我在quick watch中检查company.Users,新用户确实已添加到公司中,只是没有保存到数据库中
我做了更多的游戏,如果我这样做,我会得到一个例外:

var existingUser = _model.Users.First();
var company = existingUser.Company;
_model.ObjectStateManager.GetObjectStateEntry(company);
例外情况是:

System.InvalidOperationException:异常 ObjectStateManager不包含 引用的ObjectStateEntry 类型为“ABC.DEF.Company”的对象


在第一个(工作)场景中这样做可以在不引发异常的情况下返回ObjectStateEntry。

在EF2中,延迟加载实体。我不知道微软是否在EF4中改变了这一点。这意味着
existingUser.Company
在加载
existingUser
后为
null
。 有几种解决方案:


var existingUser = _model.Users.Include("Company").First();
var company = existingUser.Company;
...

请考虑这些可能性是我从旧EF中知道的一些方式。p> 但如果能找到适合EF4的解决方案。我认为您希望启用相关实体的延迟加载

问候。

我想起来了

为了回答这个问题,我简化了代码,但当我深入研究时,我意识到我从中获取用户的_模型实例与拯救公司的实例不同。所以实际上,我实际上做的是这样的:

var existingUser = _modelFromUserDAL.Users.First();
var company = existingUser.Company;
company.Users.Add(new User(1, "John", "Smith"));
_modelFromCompanyDAL.SaveChanges();

但他说也不例外。如果LazyLoading被禁用,访问company.users时应该会出现NullReferenceException只要他不提供更多细节,就很难提供更好的建议。我试图进一步澄清我所说的“不工作”是什么意思,并且我可以确认延迟加载是启用的。
var existingUser = _modelFromUserDAL.Users.First();
var company = existingUser.Company;
company.Users.Add(new User(1, "John", "Smith"));
_modelFromCompanyDAL.SaveChanges();