5

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

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

但是,如果我将其更改为如下所示,使用 .Remove(),那么一切都很好。

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

这是有问题的方法。请注意,我确实有一个使用 .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);
    }
}
4

2 回答 2

7

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

于 2013-04-24T14:22:14.320 回答
3

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

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

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

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

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

于 2013-04-24T14:24:02.327 回答