現象
外部キーを持つ子テーブルにデータをインサートする際、外部キーIDの値を設定しても、何故か親テーブルにからのレコードが挿入されてしまう。
また、小テーブルのデータの外部キーIDの値もNullになってしまう。
コード
親テーブル定義
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
}
子テーブル定義
public class Child
{
public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public Parent parent { get; set; } = new()
}
Insert処理
Child child = new();
child.Name = "test";
child.ParentId = "1";
context.Child.Add(child);
原因
本当に初歩的なことであるが、childのparentオブジェクトの指定がないため、Nullとして外部キーが設定されてしまっている。
エラーにはせず、EntiryFrameworkが親テーブルにもデータをインサートしている。
修正方法
childのparentオブジェクトを設定する。
Insert処理
Child child = new();
child.Name = "test";
child.ParentId = "1";
+ child.Parent = context.Parent.Where(f => f.Id == 1).FirstOrDefault();
context.Child.Add(child);
EntityFrameworkはおせっかいをしてくるため、便利な反面、予想外の処理もすることがあるため、よく調べて使用する必要があると反省。
他にも対象方法はあると思うが、一旦これで解決。