EF4 ObjectContext.EntitySet.AddObject()级联插入

时间:2010-10-29 06:51:57

标签: c# entity-framework-4

如何通过EF4向数据库添加实体,而不首先附加所有引用的实体?

var entity = new MyEntity() { FK_ID = 4 }; // associated entity key

using (var db = new MyEntities())
{
    db.MyEntity.AddObject(entity);

    db.SaveChanges();
    db.AcceptAllChanges();
}

此代码不断尝试插入新的默认值FK_Entity。

我在网上看到一些建议我需要首先附加FK_Entity,然后将MyEntity.FK属性设置为附加的FK_Entity,但这看起来很糟糕。 1)我假设附加需要加载FK_Entity,我不需要插入实体 - 我已经给它正确的密钥,如果我犯了错误,SQL将强制引用完整性。 2)由于我有更多的参考资料,我必须附上每一个??

我无法找到压制级联插入的任何选项或重载。我一定在想这个错误吗?

感谢。

2 个答案:

答案 0 :(得分:1)

你可以尝试做的是创建'虚拟'FK实体,每个实体只设置ID属性。并确保EntityStatus.Unchanged中有ObjectStateManager,以便EF不会尝试'更新'并重写FK实体的所有其他属性。

我没有机会对此进行测试,但有些内容如下:

var fkEntity = new FK_Entity { ID = 4 };
var entity = new MyEntity { FK_Entity = fkEntity };

using (var db = new MyEntities())
{
    db.AddToEntities(entity);
    ObjectStateEntry fkEntry = db.ObjectStateManager.GetObjectStateEntry(fkEntity);
    // You can check the state here while debugging, but it's probably `Added`
    fkEntity.ChangeState(EntityState.Unchanged);

    db.SaveChanges();
}

答案 1 :(得分:1)

我发现MVC Binder(或其他东西)正在创建一个我不想要它的空FK_Entity。所以我在Create()控制器处理程序属性中Exclude = "FK_Entity",并继续只设置fk_id属性。

我知道我可以使用ViewModels,将对象转换为EF类型,但我想暂时避免这种开销。

相关问题