2012-04-22 13 views
0

私は簡潔にするために簡略次のセットアップを持っている:今コードファーストフルーエントマッピングで継承プロパティを必要とする方法はありますか?

public abstract class AuditableEntity 
{ 
    public int Id { get; set; } 
    public Login Login { get; set; } // Login that create this identity. 
} 

public class Login: AuditableEntity 
{ 
    public Security Security { get; set; } 
    public Guid SessionGuid { get; set; } 
} 

public class Security: AuditableEntity 
{ 
    public string UserName { get; set; } 
    public string PasswordHash { get; set; } 
} 

LoginだけLoginエンティティ自体に必要とされていません。実際には、そのテーブルには属していないと私はこのようにそれを無視:他のすべてのテーブルの上に、必要に応じ

modelBuilder.Entity<Login>().Ignore(l => l.Login); 

は私がそれをしたいが、私は、例えばとき試してみて、それがUserに必要行います

modelBuilder.Entity<Security.Security>().Property(p => p.Login).IsRequired(); 

私はコンパイルエラーを取得し、「タイプ 『ログイン』パラメータ 『T』としてそれを使用するために非NULL可能値型でなければなりません」。すぐに明らかに解決策は非常にエレガントではありません私は私が前にIgnore呼び出しでパラメーター「T」としてそれを使用させて頂くことに注意してくださいので、私は、これは他のいくつかの、隠されたT.

私であると仮定します。

  1. Loginには、AuditableEntityのFK値を使用し、参照先は使用しないでください。
  2. Loginを付けずに新しい基本クラスを作成し、もう1つはLoginを追加し、ログインクラスを最高基底から継承し、他のすべてのクラスを直系子孫から継承します。

これを行うにはいくつかの方法がありますか?

答えて

1

ネイティブSQLプロパティのプロパティ構文を使用しています。あなたが実際にhttp://msdn.microsoft.com/en-us/library/hh295843(v=vs.103).aspxを参照ナビゲーションプロパティの構文のような.HasRequired(t=>t.Login).WithMany()

同様のものを使用したい、とは、1つのナビゲーションプロパティセクション

+0

おかげとの関係を設定します。このシナリオの継承のように私のような初心者のために少し難しいかもしれないので、私はすべてのエンティティに 'IAuditableEntity'を実装するつもりですが、それらに独自のプロパティ宣言を与えます。 – ProfK

関連する問題