私はコードファーストアプローチを使用しており、次のモデルがあります。
public class Person
{
public int ID {get; set;}
public string Name {get; set;}
public int CurrentStationID {get; set;}
public virtual Station CurrentStation {get; set;}
public int CurrentTransportationID {get; set;}
public virtual Transportation CurrentTransporation {get; set;}
}
そして、私のコントローラーの次のコード:
Models.Person model = myDBContext.Persons
.Include("CurrentStation")
.Include("CurrentTransportation")
.Where(p => p.ID == 1)
.FirstOrDefault();
DBテーブル"persons"に(1、 "Testname"、0、0)の行が存在する場合でも、"model"はNULLになります。
上記は、を使用してSQLステートメントを生成します[...] INNER JOIN stations AS [...] LEFT JOIN transportations [...]
。基になるテーブル/タイプが何であるか、またはそれらを指定する順序に関係なく、すべてのモデルについて、最初のナビゲーションプロパティに対して常に内部結合を実行します。これは常に最初のInclude()です。
「CurrentStation」がデータベースに存在する必要がないため、すべての内部結合ではなく左側結合が必要です。
なぜEFはこれを行うのですか?わかりませんが、理解したいです。どのプロパティにも[必須]属性を指定していませんが、指定した場合と同じように動作します。
残念ながら、[Optional]属性はなく、OnModelCreate-overrideを介して「HasOptional()」を実行することは私にとってオプションではありません。