试图在同一事务读取记录,然后删除这些记录时,我一直在努力与EF。 我最初使用EntityState.Deleted方法,它会给出错误:
操作失败:关系不能被改变,因为一个或多个外键的属性是不可为空。 当一个变化是有关系作出的相关外键属性设置为空值。 如果外键不支持空值,新的关系必须定义,外键属性必须指定一个非空值,或者无关的对象必须被删除。
但是,如果我改变它喜欢我下面,用一个.remove(),就万事大吉了。
- 的区别是什么,最好的时间使用一个.remove()VS .Deleted?
- 我如何才能让使用.Deleted方法这项工作? 我曾尝试创建上下文到我的仓库的一个新实例来读取和另一个删除,但随后得到了有关IEntityTracker无法跟踪多个实例的错误...我也试过在初始读取.INCLUDE加载相关记录到EF所以它知道并删除它们。 我也是第一次尝试.Detaching读取记录。 一切都是徒劳。
这是有问题的方法。 请注意,我有一个使用已经使我受益匪浅,直到这个场景中.Deleted方法的通用存储库(读取,然后删除相同的记录。)
//Delete Allocation Need and AllocatedContainers for alloc need id
public ActionConfirmation<int> 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<AllocationNeed> allocNeeds = repository.SearchFor(
x => x.FacilityId == intFacilityId
&& x.NeedSourceType == srcType
&& x.NeedSourceId == intNeedSourceId
).ToList();
//var deleteRepository = new Repository<AllocationNeed>(); <--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<int>.CreateFailureConfirmation(ex.Message, allocNeed.Id);
}
}