1

私はこれらの2つのエンティティを持っています

class AUT
{
    public Guid ID { get; set; }
    public string Name { get; set; }

    public Engineer Engineer { get; set; }
}

class InstallationSetup
{
    public virtual AUT ApplicationUnderTesting { get; set; }

    public Guid ID { get; set; }
    // Loads of properties etc
}

class Engineer
{
    public Guid ID { get; set; }
    public string Name { get; set; }
}

コードを最初に使用し、いくつかのデータ注釈を使用して、これらのエンティティはデータベースを作成します。私は EF 5 を使用しています。アプリケーションを削除すると、それ自体と、参照されている InstallationSetup のみが削除されます。エンジニアを削除するべきではありません。ただし、削除しようとすると、次のエラーが表示されます。

DELETE ステートメントは、REFERENCE 制約 "FK_dbo.InstallationSetups_dbo.AUTs_ApplicationUnderTesting_ID" と競合しました。データベース「UXLab」、テーブル「dbo.InstallationSetups」、列「ApplicationUnderTesting_ID」で競合が発生しました。ステートメントは終了されました。

したがって、AUT に依存するエントリを持つ別のテーブルがあるため、AUT を削除すると、InstallationSetup が外部キーが null のままになり、行が壊れてしまうのではないかと推測しています。

AUTへの参照を持つものも削除する必要があることをエンティティフレームワークに伝えることができるはずです(できればFluent APIを使用しないでください)?これが私が達成したいことです。

4

1 に答える 1

2

生成された外部キー列と同様の列を追加する必要があります。エンティティフレームワークがこのFK列を生成すると、カスケード削除が無効に設定されます。

class AUT
{
   public Guid ID { get; set; }
   public string Name { get; set; }

  public Engineer Engineer { get; set; }
}

class InstallationSetup
{
    public virtual AUT ApplicationUnderTesting { get; set; }
    public int ApplicationUnderTestingId {get; set;}   <--- Add this.

   public Guid ID { get; set; }
// Loads of properties etc
}

class Engineer
{
 public Guid ID { get; set; }
 public string Name { get; set; }
}

データベースを再度生成すると、いくつかの変更が行われていることがわかります。自動生成された列AUTs_ApplicationUnderTesting_IDはなくなり、ApplicationUnderTestingId列が外部キー関係に使用されるようになりました。

EFは、カスケード削除を自動的に有効にします。

于 2013-03-18T14:46:42.170 に答える