我遇到了使用实体框架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,而不会抛出异常。
答案 0 :(得分:1)
在EF2中有实体的延迟加载。我不知道微软是否在EF4中改变了这一点。这意味着加载existingUser.Company
后null
为existingUser
。
有几种解决方案:
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();