EntityState.Deleted不起作用,删除(实体)呢?(EntityState.Delet

2019-09-01 01:25发布

试图在同一事务读取记录,然后删除这些记录时,我一直在努力与EF。 我最初使用EntityState.Deleted方法,它会给出错误:

操作失败:关系不能被改变,因为一个或多个外键的属性是不可为空。 当一个变化是有关系作出的相关外键属性设置为空值。 如果外键不支持空值,新的关系必须定义,外键属性必须指定一个非空值,或者无关的对象必须被删除。

但是,如果我改变它喜欢我下面,用一个.remove(),就万事大吉了。

  1. 的区别是什么,最好的时间使用一个.remove()VS .Deleted?
  2. 我如何才能让使用.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);
    }
}

Answer 1:

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



Answer 2:

1)的区别是什么,最好的时间使用一个.remove()VS .Deleted?

看来,设置实体对已删除状态导致的SaveChanges()从数据库中删除只有特定的实体,没有考虑到可以通过一个非空的外键列引用它的其他行。

Remove()会考虑行是合作关系的一部分。

2)我如何才能让使用.Deleted方法这项工作?

如果你有ON CASCADE DELETE对相关行指定的行为,数据库应自动处理它。 这是当你让EF生成数据库的默认行为。



文章来源: EntityState.Deleted does not work, Remove(entity) does?