我正在使用EF4.1 Code First。我无法获得一个非常简单的插入来保存相关的实体ID。生成的SQL总是为任何相关实体插入NULL。示例代码如下。谁能看到我在这里做错了什么?它确实正确插入非实体属性,例如字符串。此外,我在DB初始化程序类中有类似的代码来播种测试数据,它似乎工作正常。
using (var ctx = new DataContext())
{
ctx.Users.Attach(existingUser);
// create item and add to context
var newItem = new MyItem();
ctx.MyItems.Add(newItem);
// set related entity
newItem.CreatedBy = existingUser;
ctx.SaveChanges();
}
答案 0 :(得分:1)
您的代码应该使用DbContext
的默认配置。一个可行的解释是它不起作用是你禁用了自动更改检测,例如,如果你在上下文的构造函数中有这样的东西:
public DataContext()
{
this.Configuration.AutoDetectChangesEnabled = false;
}
在这种情况下,在将新项目添加到上下文后,EF不会检测导航属性newItem.CreatedBy
的更改。 (如果未禁用更改检测,{SaveChanges
将检测到最后一次更改。)
您可以更改代码,以便在将新项目添加到上下文之前设置导航属性:
using (var ctx = new DataContext())
{
ctx.Users.Attach(existingUser);
// create item and add to context
var newItem = new MyItem();
// set related entity
newItem.CreatedBy = existingUser;
ctx.MyItems.Add(newItem);
ctx.SaveChanges();
}
无论是否有自动更改检测,都可以使用。
答案 1 :(得分:0)
试试这个:
using (var ctx = new DataContext())
{
ctx.Users.Attach(existingUser);
// create item and add to context
var newItem = new MyItem();
ctx.MyItems.Add(newItem);
// set related entity
newItem.CreatedBy = existingUser;
// Added
ctx.ObjectStateManager.ChangeObjectState(newItem.CreatedBy, EntityState.Added);
ctx.SaveChanges();
}
如果不起作用,请改为:
ctx.ObjectStateManager.ChangeObjectState(newItem.CreatedBy,EntityState.Modified);
添加了一行...希望它有所帮助。