この件に関して多くの質問があることは知っていますが、特定の問題を解決する方法を実際に説明している質問を見つけることができませんでした. これは、解決できない可能性があることを意味すると思います (EF の考え方に「逆行」している可能性があると思います) が、質問する必要があります。
私は3つの(省略された)POCOを持つモデルを持っています:
[Table("People")]
public class Person {
public int PersonID { get; set; }
[Required]
public string PersonName { get; set; }
}
public class Location {
public int LocationID { get; set; }
public int LocationTypeID { get; set; }
public virtual LocationType LocationType { get; set; }
}
public class Van : Location {
public int PartyID { get; set; }
public virtual Party Party { get; set; }
}
これらは (省略された) データベース テーブルによって支えられています (これらは手作業で記述されています)。
CREATE TABLE People (
PersonID INTEGER IDENTITY NOT NULL,
PersonName VARCHAR(255) NOT NULL,
PRIMARY KEY (PersonID)
)
CREATE TABLE Locations (
LocationID INTEGER IDENTITY NOT NULL,
LocationTypeID INTEGER NOT NULL,
FOREIGN KEY (LocationTypeID) REFERENCES LocationTypes(LocationTypeID)
)
CREATE TABLE Vans (
LocationID INTEGER NOT NULL,
PersonID INTEGER NOT NULL,
PRIMARY KEY (LocationID),
FOREIGN KEY (LocationID) REFERENCES Locations(LocationID),
FOREIGN KEY (PersonID) REFERENCES People(PersonID)
)
LocationTypes
見た目は想像できると思います。
Locations
型ごとのテーブル階層のルートです。これを強制するためのチェック制約もあります。Vans
のようなここでは関係のないものと同様に、場所の一種ですWarehouse
。
ここで、 aは aVan
に属していますPerson
。つまり、従業員にバンを発行し、燃料を満タンにするのは従業員の責任であり、クラッシュさせず、顧客のサイトに持っていき、供給がすべて使い果たされたときに追加の商品を注文するのは従業員の責任です。ネジ、ドリル ビット、外装 DC ケーブル。ただし、すべてPerson
がバンを持っているわけではなく (一部は 1 つのバンでペアで動作します)、Person
テーブルには を指す外部キーがありませんVan
。これは逆です。これはある意味では歴史的な事故ですが、状況を非常にうまくモデル化してPerson
いVan
ますVan
。
だから私の質問に:どうすればPerson
ナビゲーションプロパティをそのVan
中に入れることができますか?
public virtual Van Van { get; set; }
私はデータ注釈と流暢な API をいじくり回してきましたが、最も近いものは次のOnModelCreating
とおりです。
modelBuilder.Entity<Van>()
.HasRequired(v => v.Person)
.WithOptional(p => p.Van);
残念ながら、これはオブジェクトVan
を生成するプロキシをプロパティに設定しようとしLocation
ます。それは正しいオブジェクトである可能性もありLocation
ます (私は確認できませんでした) が、それがバンを探していることに気付いていません。PersonID
ただし、ルックアップを行うときに照合しようとしている可能性があるとLocationID
思います-Fluent APIマッピングがないと、バンがまったく取得されません。これは私が期待することです(すべてのPersonID
値は最低LocationID
値よりも低いですバンに対応するため、おそらく何も見つかりませんでした)。
Person
への null 可能な外部キーがVan
あれば、これは間違いなく非常に簡単でしょVan
うVan
。Person
.
したがって、Van
はこの関係を所有しており、Van
プロパティ onPerson
は逆ナビゲーション プロパティですが、一方の端がオプションであっても、EF はこの種の 1 対 1 のトリックがあまり得意ではないようです。それを機能させる方法はありますか、それとも妥協を受け入れる必要がありますか?
私たちは通常、Entity Framework に欠けている機能のためにデータベース モデルを妥協することを拒否します。私が本当に必要としているのは、Van
Vans.PersonID Person
= Person.PersonID.