我正在尝试将相关对象保存到数据库中。保存,更新效果很好。 我的方案是向上下文添加数据列表, 之后在保存或更新之前验证添加的数据,从上下文中删除未通过验证的记录 和插入或更新其他人。我的父数据中有很多导航属性,所以我想要的时候 我从上下文中移除父对象还应从上下文中删除其所有导航属性。 但是通过说"从上下文中移除数据" 并不意味着我还想将其从底层数据库中删除。 到目前为止我尝试过的场景:
予。第一个选项
//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);
问题:当数据库中不存在数据时,此方案很有效。当它已经存在 从本地删除记录也将其从基础数据库中删除。
问题:如何从本地上下文中删除父实体(因为它已经添加) 它的导航属性,但仍然没有从底层数据库中删除它?
答案 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提示。