エンティティ フレームワーク + mvc を使用してドメイン ツリー構造を実装しています。JSTree を使用して、組織構造を提示します。
そのモデル スキームでは、継承の条件と DomainEntity のプロパティの両方として TypeID プロパティを使用していることに注意してください。これはもちろん、次のエラーをスローします。
エラー 3 エラー 3032: 139 行目から始まるフラグメントのマッピングに問題があります: 'IsNull=False' 以外の条件を持つ条件メンバー 'DomainEntities.EntityTypeID' がマップされています。DomainEntities.EntityTypeID の条件を削除するか、マッピングから削除してください。C:\Code\CamelotShiftManagement\CamelotShiftManagement\Models\CamelotDB.edmx 140 15 CamelotShiftManagement
TypeID をプロパティとして使用せず、それを継承関連付けの条件として保持するとします。これにより、ドメイン エンティティのツリーにデータを入力しようとすると、次のようになります。
foreach (var entity in entities)
{
JsTreeModel tree = new JsTreeModel()
{
attr = new JsTreeAttribute()
{
id = entity.EntityID.ToString(),
},
data = entity.EntityName
};
if (entity is OrganizatioanlUnit)
{
tree.attr.type = eNodeType.OrganizationalUnit;
}
if (entity is Calendar)
{
tree.attr.type = eNodeType.Calendar;
}
PopulateTree(entity, tree);
io_Node.children.Add(tree);
}
新しいエンティティが導入されるときに、私が扱っているエンティティのタイプを教えてくれるプロパティにしかアクセスできない場合は、このコードを変更する必要があるため、このコードは保守できません.. :) .
ここにジレンマがあります: 各継承の条件として継承と TypeID を使用する場合、DomainEntity のプロパティとしてアクセスできません。そのため、送信先の型を決定するために、typof(entity) に対して switch-case を使用する必要があります。私の JSTree プラグインは、JSON の各ノードの型識別を期待しているためです。継承を使用しないと、ポリモーフィック機能が失われます。
私が求めているのはポリモーフィズムだけではありません..継承されたエンティティにのみ関連する他のメソッドとプロパティがあり、将来的にいくつかの注入ポイントを見ることができます...