EntityState.Deleted不起作用,Remove(entity)呢?

我在尝试读取记录时一直在与EF斗争,然后在同一个事务中删除这些记录。 我最初使用的是EntityState.Deleted方法,它会产生错误:

操作失败:无法更改关系,因为一个或多个外键属性不可为空。 当对关系进行更改时,相关的外键属性将设置为空值。 如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

但是如果我把它改成我下面的那个,使用.Remove(),那么一切都很好。

  1. 有什么区别和最佳使用时间.Remove()vs .Deleted?
  2. 我怎么能使用.Deleted方法来完成这项工作? 我已经尝试创建一个新的上下文实例到我的存储库读取和另一个删除,但后来得到的错误与IEntityTracker无法跟踪多个实例…我也试过.Include在初始读取时加载依赖记录进入EF所以它知道并删除它们。 我也尝试过。先读取读取记录。 一切都无济于事。

这是有问题的方法。 请注意,我确实有一个使用.Deleted方法的通用存储库,该方法在此方案之前一直很好用(读取然后删除相同的记录。)

//Delete Allocation Need and AllocatedContainers for alloc need id public ActionConfirmation DeleteAllocRecords(int intFacilityId, AllocNeedSourceTypes needSourceType, int intNeedSourceId) { var context = new InventoryMgmtContext(); var repository = new AllocationNeedRepository(context); //Delete Allocation Need and hence children in Allocated Containers var srcType = needSourceType.ToString(); List allocNeeds = repository.SearchFor( x => x.FacilityId == intFacilityId && x.NeedSourceType == srcType && x.NeedSourceId == intNeedSourceId ).ToList(); //var deleteRepository = new Repository(); <--tried separate instance of context to delete...no worky. foreach (AllocationNeed allocNeed in allocNeeds) { try { //NO WORK: context.Entry(allocNeed).State = System.Data.EntityState.Deleted; context.AllocationNeeds.Attach(allocNeed); context.AllocationNeeds.Remove(allocNeed); <-- Works context.SaveChanges(); } catch (Exception ex) { return ActionConfirmation.CreateFailureConfirmation(ex.Message, allocNeed.Id); } } 

Remove也将删除子对象,但使用Deleted不会。 出于这个原因你应该真正使用Remove 。 如果你真的想使用Deleted ,你必须使你的外键可以为空,但是你最终会得到孤立的记录(这是你不应该首先做的那个主要原因之一)。

1.)使用的区别和最佳时间是什么.Remove()vs .Deleted?

看起来将实体的状态设置为Deleted会导致SaveChanges()仅从数据库中删除该特定实体,而不考虑可能通过非空外键列引用它的其他行。

Remove()将考虑作为关系一部分的行。

2.)如何使用.Deleted方法完成这项工作?

如果为相关行指定了ON CASCADE DELETE行为,则数据库应自动处理它。 当您让EF生成数据库时,这是默认行为。