1

我有客户和银行账户。一个客户可以有多个银行账户,但一个银行账户可以有一个客户。

我正在尝试通过其 ID 删除银行帐户。但是当我们删除东西时,我们实际上是通过将 IsActive 属性设置为 false 来执行更新。

我的删除部分如下所示:

var bankaccounts = from b in this.unitOfWork.BankAccounts
                    where command.Ids.Contains(b.Id) // command.ids is an array with id's
                    select b;

this.unitOfWork.BankAccounts.DeleteObject(bankaccounts);

然后,在提交之前,我们有这段代码将删除转换为更新并将 IsActive 属性设置为 false

public void Commit()
{
    var addedEntities = this.GetEntitiesByState(EntityState.Added);
    foreach (var entity in addedEntities)
    {
        var property = this.GetIsActiveProperty(entity);
        property.SetValue(entity.Entity, true);
    }

    var deletedEntities = this.GetEntitiesByState(EntityState.Deleted);
    foreach (var entity in deletedEntities)
    {
        var property = this.GetIsActiveProperty(entity);
        if (property != null)
        {
            entity.State = EntityState.Modified;
            property.SetValue(entity.Entity, false);
        }
    }

    this.mapper.Commit();
}

private IEnumerable<DbEntityEntry> GetEntitiesByState(EntityState state)
{
    return this.context.ChangeTracker.Entries().Where(e => e.State == state);
}

private PropertyInfo GetIsActiveProperty(DbEntityEntry entity)
{
    return entity.Entity.GetType().GetProperty("IsActive", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
}

当我删除“根”实体(如客户)时效果很好,但是当我尝试删除“子”实体(如银行账户)时,我得到了这个异常:

来自“CustomerBankAccounts”AssociationSet 的关系处于“已删除”状态。给定多重约束,相应的“BankAccount”也必须处于“已删除”状态。

我不确定为什么会收到此错误。我只是更新我的银行帐户,而不是删除它。有人可以解释为什么我会得到这个异常以及如何解决这个问题吗?

4

1 回答 1

2

当您同时调用DeleteObjectthe和时,它与它BankAccount之间的关系被标记为删除。BankAccountCustomer

稍后您将状态更改BankAccountEntityState.Modified而不是删除它。但是,与 的关系Customer仍被标记为删除。

EntityFramework 现在想要提交更改并删除关系。由于这是一种识别关系,它希望 aBankAccount应该与它一起被删除,但事实并非如此。因此错误消息。

要解决此问题,您需要将关系设置为不被删除。我现在还没有准备好代码,但我假设具有该GetEntitiesByState方法的同一个类也应该有一个GetRelationshipsByState或类似的东西。

这些关系在列表中也有一个条目DbChangeTracker.Entries()。您将需要找到一种方法来找到您想要保持的正确关系,但这样做的地方是您的其他检测代码(var property = this.GetIsActiveProperty(entity);等)现在所在的位置。

于 2013-07-11T08:37:12.690 回答