Entity Framework Code First を使用して作成された Entity Framework Model があります。これは、Table Per Hierarchy 継承を使用しており、構造は次のようになります。
public abstract class BaseState
{
public int Id { get; set; }
public string StateName { get; set; }
// etcetera
}
public class CreatedState : BaseState
{
public User Owner { get; set; }
}
public class UpdatedState : BaseState
{
public User Owner { get; set; }
}
今、それが作成するものは、私が持っていて保存しているBaseStates
テーブルにあります。しかし、クラスが aと an の両方になることは決してないことを考えると、両方に単一を使用するのが論理的であるように思われます。これにより、データベースの追跡も容易になります。Owner_Id
Owner_Id1
CreatedState
UpdatedState
Owner_Id
私の基本的な質問は、これは Code First EF4 で可能ですか?
列をマップしようとしました:
public class CreatedState : BaseState
{
[Column("OwnerId")]
public User Owner { get; set; }
}
public class UpdatedState : BaseState
{
[Column("OwnerId")]
public User Owner { get; set; }
}
それは効果がないように見えました。
次に、共有の親クラスを作成しようとしましたが、これはおそらくより正しいオブジェクト指向です。
public abstract class OwnedState : BaseState
{
public User Owner { get; set; }
}
public class CreatedState : OwnedState
{
}
public class UpdatedState : OwnedState
{
}
繰り返しますが、サイコロはありません。または、もっと心配なことに、これが機能するクラス間に正確な違いが見られない場合、これは機能する場合と機能しない場合があります (明らかに私の実際の構成はもう少し複雑です)。
何が失敗したかの詳細については、編集してください。上記のように動作する 2 つのフィールドがあります。関連するクラスOwnedState
とを呼び出すことができますActivityState
。どちらも、最後の例で示した方法で抽象クラスとして作成しました。OwnedState
そこから派生する 2 つのクラスがあり、ActivityState
3 つのクラスがあります。私が持っているデータベースではActivityState_Id
、OwnedState_Id
とOwnedState_Id1
.
OwnedState
クラスとクラスの間には、それらが参照するタイプ(両方の他のエンティティ)を除いてまったく違いはActivityState
ありませんが、データベースでは、EFが何らかの形でそれらを異なる方法で解釈したように見えます-EFの内部を十分に理解していませんそれがどのようにその決定を下すかを知っています。