Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从具有所有导航属性的上下文中分离对象_C#_Entity Framework_Ef Code First - Fatal编程技术网

C# 从具有所有导航属性的上下文中分离对象

C# 从具有所有导航属性的上下文中分离对象,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我正在尝试将相关对象保存到数据库中。保存、更新效果很好。 我的方案是将数据列表添加到上下文中, 在保存或更新之前验证添加的数据之后,从上下文中删除验证失败的记录 并插入或更新其他。在我的父数据中有很多导航属性,所以我希望在 I从上下文中删除父对象其所有导航属性也应从上下文中删除。 但是说“从上下文中删除数据”并不意味着我也想从底层数据库中删除它。 到目前为止我已经尝试过的场景: I.第一选项 //Get the object context to be able to use Detach //

我正在尝试将相关对象保存到数据库中。保存、更新效果很好。 我的方案是将数据列表添加到上下文中, 在保存或更新之前验证添加的数据之后,从上下文中删除验证失败的记录 并插入或更新其他。在我的父数据中有很多导航属性,所以我希望在 I从上下文中删除父对象其所有导航属性也应从上下文中删除。 但是说“从上下文中删除数据”并不意味着我也想从底层数据库中删除它。 到目前为止我已经尝试过的场景:

I.第一选项

//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);
myContext.Entry(parentEntity).State = System.Data.EntityState.Unchanged;
//EntityType is type of parent entity
myContext.Set<EntityType>().Local.Remove(parentEntity);
问题:它只分离父实体本身,因此导航属性仍然存在

II。第二种选择

//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);
myContext.Entry(parentEntity).State = System.Data.EntityState.Unchanged;
//EntityType is type of parent entity
myContext.Set<EntityType>().Local.Remove(parentEntity);
问题:它只分离父实体本身,因此导航属性仍然存在

III.第三种选择

//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);
myContext.Entry(parentEntity).State = System.Data.EntityState.Unchanged;
//EntityType is type of parent entity
myContext.Set<EntityType>().Local.Remove(parentEntity);
//EntityType是父实体的类型
myContext.Set().Local.Remove(parentEntity);
问题:当数据库中不存在数据时,此方案效果良好。当它已经存在时 从本地删除记录也会将其从基础数据库中删除

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

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

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

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);                    
        }
    }
}
private void RemoveFromContext(列表entityList)
其中EntityType:class
{
if(entityList!=null&&entityList.Count>0)
{
foreach(entityList中的EntityType实体)
{                  
myContext.Set().Local.Remove(实体);
}
}
}
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;
            }
        }
    }
}
private void DetachRemovedRecords()
{
//获取对象上下文以便能够分离实体
System.Data.Objects.ObjectContext myObjectContext=
((IObjectContextAdapter)myContext.ObjectContext;
i可数删除记录=
taxesObjectContext.ObjectStateManager.GetObjectStateEntries(
System.Data.EntityState.Deleted);
if(deletedRecords!=null
&&deletedRecords.Count()>0)
{
foreach(删除记录中的ObjectStateEntry)
{
if(stateEntry!=null
&&stateEntry.Entity!=null)
{
myObjectContext.Entry(stateEntry.Entity).State=
System.Data.EntityState.Distached;
}
}
}
}
感谢@FarhadJabiyev的提示