使用所有导航属性从上下文中分离对象

时间:2015-02-16 11:18:21

标签: c# entity-framework ef-code-first

我正在尝试将相关对象保存到数据库中。保存,更新效果很好。 我的方案是向上下文添加数据列表, 之后在保存或更新之前验证添加的数据,从上下文中删除未通过验证的记录插入或更新其他人。我的父数据中有很多导航属性,所以我想要的时候 我从上下文中移除父对象还应从上下文中删除其所有导航属性。 但是通过说"从上下文中移除数据" 并不意味着我还想将其从底层数据库中删除。 到目前为止我尝试过的场景:

予。第一个选项

//Get the object context to be able to use Detach
//Because I use code first
System.Data.Objects.ObjectContext taxesObjectContext = 
         ((IObjectContextAdapter)myContext).ObjectContext;

//Detach entity from context to not update it
taxesObjectContext.Detach(parentEntity);

问题:它只会分离parentEntity本身,因此导航属性仍然​​存在

II。第二个选项

myContext.Entry(parentEntity).State = System.Data.EntityState.Unchanged;

问题:它只会分离parentEntity本身,因此导航属性仍然​​存在

III。第三个选项

//EntityType is type of parent entity
myContext.Set<EntityType>().Local.Remove(parentEntity);

问题:当数据库中不存在数据时,此方案很有效。当它已经存在 从本地删除记录也将其从基础数据库中删除

问题:如何从本地上下文中删除父实体(因为它已经添加) 它的导航属性,但仍然没有从底层数据库中删除它?

1 个答案:

答案 0 :(得分:0)

我没有找到任何方法来分离具有所有导航功能的对象。由于我的目标是删除未通过验证的记录,并且我不向数据库发送任何删除查询我解决了我的问题,如下所示:

我。将验证失败的记录添加到错误日志表

II。然后,我从上下文中删除验证失败的记录:

private void RemoveFromContext<EntityType>(List<EntityType> entityList)
            where EntityType : class
{
    if (entityList != null && entityList.Count > 0)
    {
        foreach (EntityType entity in entityList)
        {                  
            myContext.Set<EntityType>().Local.Remove(entity);                    
        }
    }
}

III。最后,我正在分离所有已删除的记录,因为已删除的记录是验证失败的记录

private void DetachRemovedRecords()
{
    //Get object context to be able to detach entities
    System.Data.Objects.ObjectContext myObjectContext =
        ((IObjectContextAdapter)myContext).ObjectContext;

    IEnumerable<ObjectStateEntry> deletedRecords =
        taxesObjectContext.ObjectStateManager.GetObjectStateEntries(
        System.Data.EntityState.Deleted);

    if (deletedRecords != null
        && deletedRecords.Count() > 0)
    {
        foreach (ObjectStateEntry stateEntry in deletedRecords)
        {
            if (stateEntry != null
                && stateEntry.Entity != null)
            {
                myObjectContext.Entry(stateEntry.Entity).State =
                       System.Data.EntityState.Detached;
            }
        }
    }
}

感谢@FarhadJabiyev提示。

相关问题