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

时间:2010-06-12 10:21:24

标签: entity-framework navigation properties

我遇到了使用实体框架4.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();

因此,如果我向公司添加一个直接从模型中提取的用户,那么一切正常。但是,如果将用户添加到作为另一个对象的导航属性提取的公司,则它不起作用。

有人可以告诉我这是否是预期的行为,或者我是否可以做些什么来做到这一点?

谢谢!

修改

澄清我的意思是“它不起作用”;

  • 单步执行代码会显示执行指针经过所有行而不会抛出异常。
  • 没有新行添加到数据库
  • 如果我检查公司。快速观看的用户,新用户确实已添加到公司 - 它只是没有保存到数据库。

我已经多做了一些游戏,似乎如果我这样做,我会得到一个例外:

var existingUser = _model.Users.First();
var company = existingUser.Company;
_model.ObjectStateManager.GetObjectStateEntry(company);

例外是:

  

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

为第一个(工作)场景执行此操作会为我提供一个ObjectStateEntry,而不会抛出异常。

2 个答案:

答案 0 :(得分:1)

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


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


var existingUser = _model.Users.First();
existingUser.CompanyReference.Load();
var company = existingUser.Company;
...

请考虑这些可能性是我从旧EF中了解的一些方法。

但是如果找到this作为EF4的正确解决方案。我想你想启用相关实体的延迟加载。

问候。

答案 1 :(得分:0)

我明白了......

我为了这个问题而简化了代码,但是当我深入研究它时,我意识到我从中获取用户的_model实例与保存公司的实例不同。实际上,我实际上做的更像是这样:

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