2013-03-14 125 views
0

我有一個用戶實體有我的用戶存儲在。對於一些用戶(管理員)我想添加額外的細節。 我寫了下面的代碼。EF 5.0代碼第一導航屬性

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表導航到我的用戶配置文件表,通過編寫例如。 admin.UserProfile.UserName。但是,當我運行我收到的數據庫更新時:

此關聯的主體端必須使用關係fluent API或數據註釋顯式配置。

當我刪除UserProfile屬性時,一切都很好。如何在我的AdminDetail類中創建「後退」導航?

回答

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; } 
} 
2

實體框架代碼首先允許將多態類存儲在同一個表中。你有沒有考慮過使用這種關係呢?

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創建和管理你。此列指示表中的每一行是UserProfile還是AdminProfile。具有UserProfile類型的行在EF訪問時會忽略特定於AdminProfile的列。

實體框架爲您處理所有類型歧視,因此您無需直接擔心。您的DbContext將只有一個DbSet,它也可以存儲AdminProfile類型的實體。

相關問題