「テーブル」と「チキン」の2つのエンティティオブジェクトがあるとします。
今、私は「翼」オブジェクトを持っていて、その翼がテーブルと鶏肉と0..1-1の関係を持つようにしたいとしましょう。言い換えれば、null許容のtable.wingとnull許容のchicken.wingが必要です。
Entity Framework 4を使用して、wingオブジェクトにテーブルまたはチキンのいずれかに関連付けることができるという制限を設ける良い方法はありますか?
注:辞書にwingedobjectsベースクラスを含めたくありません。これは、「isone」ではなく「hasone」である必要があります。
私の考えでは、参照のコレクションを独自に制限することはできないため、Entityプロパティを次のようにラップする必要があります。
public partial class Wing:
...
public Table Table
{
get { return this.Table; }
set {
//make sure Chicken is null
this.Table = value;
}
}
...
}
これは私をかなりハッキーでクリーンすぎないように思わせるので、ベストプラクティスではないにしても、より良いプラクティスソリューションを探していました。
編集:
明確にするために、私は現在、テーブルと翼の間に0..1-1の関係があり、鶏と翼の間に0..1-1の関係があります。したがって、table.wingを作成してから、wing.tableを確認できます。私が欲しいのは、table.wing.chickenまたはchicken.wing.tableをクエリする場合、常にnull値を持つようにすることです。ウィングは、1つのテーブルまたは1つのウィングのいずれかに関連付けられている必要があります。
現在の行動の例:
@morganppdxのコメントに応えて:
この実体図を考えると:
そして、Program.csでは次のようになります。
class Program
{
static void Main(string[] args)
{
Model1Container container = new Model1Container();
Wing chickenwing = new Wing { Shape = "birdlike" };
Chicken chicken1 = new Chicken { Breed = "Andalusian", Wing = chickenwing };
Table table1 = new Table { Style = "Mission", Wing = chickenwing }; // Should throw exception!
container.AddToChickens(chicken1);
container.AddToTables(table1);
container.SaveChanges();
Console.Write(String.Format("Table {0}'s wing has a {1} shape...", table1.Id, table1.Wing.Shape));
Console.Write(String.Format("Table {0} has {1} chicken wings!", table1.Id, table1.Wing.Chicken.Breed));
Console.ReadLine(); //wait for input to give us time to read
}
}
結果のコンソールには次のように表示されます。
Table 1's wing has a birdlike shape...Table 1 has Andalusian chicken wings!
この結果は私が避けたいものです。チキンウィングがtable1に関連付けられている場合は、例外をスローする必要があります。これは、すでにchicken1に関連付けられており、テーブルとチキンの両方に関連付けることはできないためです。
関係を誤って構築している可能性が非常に高いため、@morganpdxで指定されている例外が必要な場所で取得されません。