![](/img/trans.png)
[英]EF4.1 Code First : How to disable delete cascade for a relationship without navigation property in dependent entity
[英]EF4.1 Code First Add Entity with Related Entity
我正在使用EF4.1代码优先。 我无法获得非常简单的插入内容来保存相关的实体ID。 生成的SQL始终为任何相关实体插入NULL。 示例代码如下。 有人可以在这里看到我在做什么错吗? 它确实可以正确插入非实体属性,例如字符串。 另外,在数据库初始化程序类中,我也有类似的代码可以播种测试数据,而且看起来工作正常。
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();
}
您的代码应与DbContext
默认配置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();
}
无论有没有自动更改检测,这都可以工作。
尝试这个:
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);
添加了1行...希望对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.