13

CommonEntity他の多くのエンティティで外部キーとして使用される主キーを持つエンティティと呼びましょう。アプリケーションが開発されるにつれて、これらのリンクは拡大し続けます。

安全に削除できるかどうかを確認する方法が必要ですCommonEntity(つまり、他のエンティティによって使用されていません)。

できることに気づきました

if(!ce.EntityA.Any() && !ce.EntityB.Any() ... && !ce.EntityN.Any())
{
   //Delete
}

しかし、新しい関係を追加するたびに戻ってこのコードを手動で変更しなければならないという考えが好きではないので、すべての関係を自動的にチェックする方法を望んでいます。おそらく、私が気付いていない EF4+ の何かがありますか?

トランザクション スコープを使用してオブジェクトを削除し、失敗した場合はロールバックすることは可能かもしれないと考えましたが、このアプローチに悪影響があるかどうかはわかりませんでした。

より良いアプローチはありますか?

編集: VS2012 は、プロジェクトが .Net 4 であっても EF5 を使用しているように見えるため、DB から生成されたにもかかわらず、POCO を使用してモデルを作成しました。

4

4 に答える 4

13

失敗させてください。エンティティに多くの関係がある場合、その検証は非常に重くなる可能性があります。

public bool TryDelete(int id)
{
    try
    {
        // Delete
        return true;
    }
    catch (SqlException ex)
    {
        if (ex.Number == 547) return false; // The {...} statement conflicted with the {...} constraint {...}
        throw; // other error
    }
}
于 2012-10-12T06:13:04.340 に答える
5

あなたはこれを試すことができます:

var allrelatedEnds = ((IEntityWithRelationships)ce).RelationshipManager.GetAllRelatedEnds();
bool hasRelation = false;
foreach (var relatedEnd in allrelatedEnds)
{
    if (relatedEnd.GetEnumerator().MoveNext())
    {
        hasRelation = true;
        break;
    }
}

if (!hasRelation)
{
    //Delete
}
于 2012-10-12T04:49:05.450 に答える