例えば「売上」テーブルがあって「担当者ID」「入力者ID」とそれぞれ「従業員」マスタテーブルを参照する項目があった場合、確か(うろ覚えだが)ASP.NET MVCでシステムを構築していた際にModelの作成がうまくできず(結合できない?)、仕方がないからSQLServer側に従業員マスタから「入力者従業員」とView(MVCだとややこしいがMVCの画面のViewではなくデータベース)を作ってASP.NET MVCではModelをそれぞれ「担当者」「入力者」とそれぞれ作成、売上テーブルからもそれぞれ参照という無駄?な作りにした。
今回、ASP.Core MVCに移行することになって同様に作成(というかコピー)していたところ、View(MVCだとややこしいがMVCの画面のViewではなくデータベース)で作成したModelをDBContextからLINQ?で呼び出した際に以下のエラーになってしまった。
Unable to determine the relationship represented by navigation
半日くらい調べてようやく解決。
以下のようModelを設定する。(データベースの「入力者従業員」は結果不要になった)
「売上」
[Column("employee_id")]
[DisplayName("担当者")]
public int? EmployeeId { get; set; }
[Required(ErrorMessage = "{0}は必須入力です。")]
[Column("enter_employee_id")]
[DisplayName("入力者")]
public int EnterEmployeeId { get; set; }
・・・
public virtual Employee? Employee { get; set; }
public virtual Employee? EnterEmployee { get; set; }
「従業員」(前は「担当者従業員」と「入力者従業員」の2つ作成していた)
public int Id { get; set; }
public string Code { get; set; } = null!;
public string Name { get; set; } = null!;
・・・
[InverseProperty("Employee")]
public virtual ICollection? EmployeeSales { get; set; }
[InverseProperty("EnterEmployee")]
public virtual ICollection? EnterEmployeeSales { get; set; }
ポイントはInversePropertyですかね。