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