0

ユーザーが格納されている User エンティティがあります。一部のユーザー (管理者) については、詳細を追加したいと考えています。次のコードを書きました。

 public partial class UserProfile 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    [Display(Name = "EMail")]
    [Required]
    public string UserName { get; set; }



    [ForeignKey("AdminDetailID")]
    public virtual AdminDetail AdminDetail { get; set; }
    public int? AdminDetailID { get; set; }

}   

public class AdminDetail 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int AdminDetailID { get; set; }

    [ForeignKey("UserId")]
    public virtual UserProfile UserProfile { get; set; }
    public int UserId { get; set; }   

}

たとえば、次のように記述して、AdminDetail テーブルから User Profile テーブルに戻るのが好きです。admin.UserProfile.UserName. ただし、Database-Update を実行すると、次のメッセージが表示されます。

この関連付けのプリンシパル エンドは、リレーションシップ fluent API またはデータ アノテーションを使用して明示的に構成する必要があります。

UserProfile プロパティを削除すると、すべてが正常に機能します。AdminDetail クラス内で「戻る」ナビゲーションを作成するにはどうすればよいですか?

4

2 に答える 2

2

Entity Framework Code-First では、ポリモーフィック クラスを同じテーブルに格納できます。代わりにこのような関係を使用することを検討しましたか?

public partial class UserProfile 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    [Display(Name = "EMail")]
    [Required]
    public string UserName { get; set; }
}   

public class AdminProfile : UserProfile   
{
    // AdminProfile members.
}

これにより、EF が作成して管理する Discriminator という追加の列を持つ UserProfile テーブルが作成されます。この列は、テーブルの各行が UserProfile か AdminProfile かを示します。UserProfile 型の行は、EF によってアクセスされたときに、AdminProfile に固有の列を無視します。

エンティティ フレームワークがすべての型の識別を処理するので、それについて直接心配する必要はありません。DbContext は、タイプ AdminProfile のエンティティも格納できる DbSet を持つだけです。

于 2013-03-14T14:21:14.053 に答える
0

UserProfileクラスに FK を含める必要はありません。適切な 1:1 のみを設定するには、AdminDetailクラスが実際にクラスへの外部キーを持つ必要がありますUserProfile。仮想プロパティを保持して、前後に移動できるようにすることもできます。EF は、ユーザーが何をしているのかを認識します。これに似ています:

public partial class UserProfile 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    [Display(Name = "EMail")]
    [Required]
    public string UserName { get; set; }

    public virtual AdminDetail AdminDetail { get; set; }
} 
于 2013-03-14T14:11:08.187 に答える