1

私には顧客と銀行口座があります。顧客は複数の銀行口座を持つことができますが、銀行口座は 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

とその関係のDeleteObject両方を呼び出すと、削除対象としてマークされます。BankAccountBankAccountCustomer

後で、削除する代わりにBankAccount状態を変更します。EntityState.Modifiedただし、 との関係Customerはまだ削除対象としてマークされています。

EntityFramework は、変更をコミットしてリレーションシップを削除しようとしています。これは識別関係であるため、BankAccountを一緒に削除する必要がありますが、そうではありません。したがって、エラーメッセージ。

これを修正するには、関係を削除しないように設定する必要があります。現在、コードの準備はできていませんが、GetEntitiesByStateメソッドを持つ同じクラスには、GetRelationshipsByStateまたは同様のものが必要であると想定しています。

関係もDbChangeTracker.Entries()リストにエントリがあります。保持したい適切な関係を見つける方法を見つける必要がありますが、それを行う場所は、他の検出コード (var property = this.GetIsActiveProperty(entity);など) が現在存在する場所です。

于 2013-07-11T08:37:12.690 に答える