2

次の構造の既存のDBがあります。 ここに画像の説明を入力してください

EF fluent APIを使用して、テーブル間の関係を構成しています。

public GroupEntityConfiguration()
{
    HasMany(x => x.Employees).WithRequired().HasForeignKey(x => x.GroupId).WillCascadeOnDelete(true);
}

public EmployeeEntityConfiguration()
{            
    HasOptional(x => x.InnerGroupMember).WithRequired();
}

この構成を適用すると、新しいEmployee、新しいInnerGroupMemberを追加したり、データをフェッチしたりできます。Employeeを削除しようとすると問題が発生します。次に、例外が発生します。

1つ以上の外部キープロパティがnull許容でないため、関係を変更できませんでした。リレーションシップに変更が加えられると、関連する外部キープロパティがnull値に設定されます。外部キーがnull値をサポートしていない場合は、新しい関係を定義するか、外部キープロパティに別の非null値を割り当てるか、関連のないオブジェクトを削除する必要があります。

私が理解している限り、上記の例外はGroupId外部キーに関連しています。それを修正しようとすると、EmployeeEntityConfigurationに次の行を追加します。

HasKey(x => new { x.Id, x.GroupId});

しかし、それを追加した後、InnerGroupMemberオブジェクトに関連していると思われる別の例外が発生します。

無効な列名'Guest_Id'。無効な列名'Guest_GroupId'。

InnerGroupMemberナビゲーションプロパティをコメントアウトしてその構成を削除すると、Employeeを削除できます。

私が間違っていることと、必要なすべての操作を実行できるようにエンティティを構成する方法についてのヒントを教えてください。ありがとう!

4

2 に答える 2

2

既存のグループエンティティがあり、従業員グループコレクションから従業員を削除したい:

var group = groupRepository.Find(groupId);
group.RemoveEmployee(employeeId);
_unitOfWork.Save();

Groupエンティティ内のRemoveEmployee関数は次のようになります。

public void RemoveEmployee(int employeeId)
{
    var employee = Employees.Single(n => n.Id == employeeId);
    Employees.Remove(employee);
}

それが私が例外を得る理由です:

1つ以上の外部キープロパティがnull許容でないため、関係を変更できませんでした。

この投稿を読んだ後HasKey(x => new { x.Id, x.GroupId});、2番目の例外につながるEmployeeEntityConfiguration内の関数を追加して修正したいと思いました。

無効な列名'Guest_Id'。無効な列名'Guest_GroupId'。

実際、DB構造を変更せずにこの手順を実行しました(つまり、HasKey関数を追加しました)。これを機能させるには、Employeesテーブル内に、外部キーでもあるIdとGroupIdの組み合わせである複合キーを作成する必要があります。この変更により、InnerGroupMembersテーブル内で強制的に変更が行われます。DB構造は次のようになります。 ここに画像の説明を入力してください

これで、最初に示した方法でEmployeeを削除できるようになりました。

とにかく、私はこの解決策には行きません。それらは私が望むことを達成するためのさまざまな方法です。ここにいくつかのリンクがあります:

于 2013-03-10T13:50:16.563 に答える
0

1対1の関係の場合、カスケード削除は、必要な関係の場合でも、デフォルトでは有効になっていません(必要な1対多の関係の場合、つまりWillCascadeOnDelete(true)、1対多のマッピングでは冗長です)。 。1対1の関係のカスケード削除は、常に明示的に定義する必要があります。

HasOptional(x => x.InnerGroupMember).WithRequired().WillCascadeOnDelete(true);

nowを削除するEmployeeと、データベースは関連するInnerGroupMemberものも削除し、例外が消えるはずです。

于 2013-03-09T18:43:08.857 に答える