次の表を想定します。
ParentEntities
ParentID
ChildEntities
ChildID
ParentID
これらのテーブルには、スキーマで定義された FK がありません。
EF デザイナーで、DB から生成した後、関連付けを追加します。
- 親の多重度: 1
- 子の多重度: 0 または 1
ビルドすると、「エラー 3027: 次の EntitySet/AssociationSet - ParentChild にマッピングが指定されていません」というエラーが表示されます。
しかし、このような関連付けのテーブル マッピングを構成しようとすると..
Maps to ChildEntities
Parent
ParentID <-> ParentID (parent entity prop <-> child table column)
Child
ChildID <-> ChildID (child entity prop <-> child table column)
.. 私はこれを取得します:エラー 3007: 行 xxx、xxx で始まるフラグメントのマッピングの問題: 列 [ParentID] は、両方のフラグメントで異なる概念的な側面のプロパティにマップされています。
なぜこれがエラーなのか意味がありません。現在の実装の制限?
[編集 1]
1-N アソシエーションを作成することで、この作業を行うことができます。これは理想的ではありませんが、パーシャルに読み取り専用の子プロパティを追加するだけで同じように機能します。
public partial class Parent
{
public Child Child { get { return Childs.Any() ? null : Childs.First(); } }
}
これは私にとって最良の解決策のようです。EF に関連付けとナビゲーション プロパティを生成させるには、データベースに FK を追加する必要がありましたが、追加すると FK を削除でき、DB からモデルをさらに更新しても、関連付けまたはナビゲーション プロパティは削除されませんでした。 .
[編集 2]
EF でモデル化されているアソシエーションを気にせずに回避する方法を調査していたときに、別の問題に遭遇しました。読み取り専用の Child プロパティの代わりに、通常のプロパティにしました..
public partial class Parent
{
public Child Child { get; set; }
}
..しかし今、クエリからそれを具体化する方法が必要です:
var query = from parents in context.Parents
// pointless join given select
join child in context.Childs
on parents.ParentID equals child.ParentID
select parents;
匿名型を選択できます..
// step 1
var query = from parents in context.Parents
join child in context.Childs
on parents.ParentID equals child.ParentID
select new { Parent = parents, Child = child };
..しかし、それをエンティティに取り込むには、より多くのサイクルを消費する必要があります。
// step 2
var results = query.Select(x => {
var parent = x.Parent;
parent.Child = x.Child;
return parent; });
EFマテリアライザーが最初から実行できるように、クエリ選択からこれを行うためのより良い/合理化された方法はありますか? そうでない場合は、編集1の方法論に頼ります..