私の人生のためにこれを理解することはできません。MSDNの記事は明確ではなく、古くなっているようです。私はEF5を使用しており、次のように一方向の関係を設定しようとしています。これが私がこれまでに持っているものです。
public sealed class Capture {
/// <summary>
/// Get and Set Capture's Unique Identifier.
/// </summary>
public int Id { get; set; }
/// <summary>
/// Get and Set Capture's Operating System.
/// </summary>
public OperatingSystem OperatingSystem { get; set; }
}
public sealed class OperatingSystem {
/// <summary>
/// Operating System's Unique Identifier.
/// </summary>
public int Id { get; set; }
}
internal sealed class EntityCaptureConfiguration : EntityTypeConfiguration<Capture> {
/// <summary>
/// Create an Entity Capture Configuration.
/// </summary>
public EntityCaptureConfiguration() {
this.ToTable("Capture");
this.HasKey(m => m.Id);
this.Property(m => m.Id).HasColumnName("Id");
this.HasRequired(m => m.OperatingSystem).WithRequiredDependent().Map(m => {
m.ToTable("OperatingSystem");
m.MapKey("OperatingSystemId");
});
}
}
コンパイルして実行すると、次のランタイム例外が発生します。 "エラー3034:16、46行目から始まるフラグメントのマッピングで問題が発生しました:キーが異なる可能性のある2つのエンティティが同じ行にマッピングされています。これら2つのマッピングフラグメントがAssociationSetの両端をマッピングしていることを確認してください対応する列に。」
2つの特定のキーを使用してこれらの2つのテーブルを結合したいことを示す明確な方法が文字通りないことに気づかずにはいられません。親テーブルの結合に使用する子テーブルのキーをどこで指定するのですか?
これが私が助けを必要としているものです:
「 OperatingSystemId 」という名前のキャプチャタイプのプロパティを公開したくありません。「OperatingSystem」プロパティで十分です。
Captureタイプ とOperatingSystemタイプの間に双方向の関係は必要ありません。CaptureからOperatingSystemへの一方向の関係のみが必要です。
データベースのオペレーティングシステムテーブルに「CaptureId 」という名前の列を作成したくありません。なぜそれが必要なのかさえ分かりませんが、そのようにすることを提案している記事をどこかで読みました。
生成されるSQL結合は、OUTERJOINではなくINNERJOINである必要があります。
CaptureタイプのOperatingSystemプロパティを仮想として定義する必要が本当にありますか?このプロパティを遅延ロードしたくありません。
ボーナスは、私が完全に迷子になっているので、この例外を私に説明できる誰かを指しています。Google検索はFluentAPIには絶望的です。デザイナーを使っているとヒット数が多いのですが、すべての結果がモデルの再生成を示唆しているので、関係ないと思いますが、ここでは当てはまらないと思います。
更新: 私はおそらくこれについてはっきりしていませんでした。SQLServerでデータベースモデルを既に設定しています。デザイナを使用せずに、既存のデータベースモデルに対してFluentAPIを使用してEFコンテキストを構成する方法を理解しようとしています。デザイナを使用する場合は、データベースからコンテキストを生成するようにデザイナに依頼できることを理解しています。それは私が望んでいることではありません。そして、その理由に興味がある人のために-FluentAPIを使用してそれを行う方法を理解したいからです。
Update2: つまり、私が設定したものと同じように、クエリでナビゲーションプロパティにフィルターを指定すると、EFは結合を正しく生成します。これを行わないと、クエリで結合が生成されません。とにかく、ナビゲーションプロパティはまだ入力されていません!
よろしくお願いします。