たとえば、Trip と Activity という 2 つのエンティティがあります。それらの間の関係は多対多であるため、結合テーブルは EF によって自動的に作成されます。
エンティティ トリップ属性:
-ID (PK) データベースによって生成 -
名前
-説明
-Property1
-Property2
-Property3
エンティティ アクティビティ属性 (このエンティティには固定レコードが含まれます - 読み取り専用 - 挿入の実行時にここにレコードは挿入されません):
-Id
(PK) データベースによって生成される
-名前 -説明 -
コスト
結合テーブルには、同時に主キーと外部キーである上記のエンティティの ID である 2 つの列が含まれています。
EF が結合テーブル TripActivities を自動的に作成し、それにエントリを正常に追加するエントリを挿入しても問題はありません。また、エントリはエンティティ Trip に正常に追加され、エンティティ Activity は変更されません。
私の問題は、たとえば、エントリの更新に関するものです-ユーザーがGUIから旅行に関連する情報を変更できるとします-したがって、このGUIからすべての情報を取得し、次の手順を実行して既存の旅行を更新します:
Trip trip = Context.Trips.Find(id); // Search for the appropriate trip to update from Id
trip.Name = ObtainNameFromGUI();
trip.Description = ObtainDescriptionFromGUI();
trip.Property1 = ObtainProperty1FromGUI();
trip.Property2 = ObtainProperty2FromGUI();
trip.Property3 = ObtainProperty3FromGUI();
trip.Activities = new List<Activity>();
// From the GUI user selects from a checkbox list the activities associated to the trip
// So we read its Ids and from those ids we fetch from database the activities to obtain
// the info related to each activity selected in the GUI. This is all done inside the
// below method.
List<Activity> activities = this.ObtainActivitiesSelectedFromGUI();
// If no activites selected (=null) I want EF automatically deletes the entries in the
// joined table for this trip. And of course, if there are activities selected, EF
// should update the respectives entries in the joined table for this trip with the new
// ones.
if (activites != null)
{
activities.ForEach(a =>
{
trip.Activities.Add(a);
});
}
context.Trips.Add(trip);
context.SaveChanges();<br><br>
これを行うことで、関連するすべてのエンティティを EF で更新する必要があります (Activity には固定エントリがあるため、変更しないでおく必要があります)。つまり、Trip と結合されたテーブルが自動的に更新されますが、機能しません。結合されたテーブル(機能しているのは、エンティティのアクティビティが変更されていないことだけです)。
これを達成する方法は?これを行うために何時間も費やしましたが、成功しませんでした...
前もって感謝します。
編集:
次の行を削除しました:
context.Trips.Add(trip);
結果は次のようになります: -
エンティティ トリップは正しく更新され、新しいレコードは追加されません。
-エンティティ アクティビティは変更されずに保持されます。これは問題ありません。
-結合テーブル: 更新されている現在の旅行の古いレコードは更新されません。代わりに、現在の旅行に正しくない新しいレコードが挿入されます。