2016-07-05 61 views
0

我正在嘗試創建2個實體,用戶和用戶評論,其中用戶評論有一個複合主鍵,它們是用戶的ID,獲得評審的人員和誰做的,這個組合主鍵也是用戶表中的主鍵的外鍵,但EF正在創建一個額外的列,我沒有看到它的點,當我保存到數據庫的用戶審查對象此列沒有被填充,它總是空的。複合主鍵和外鍵代碼優先

這是因爲當我嘗試用其評論檢索用戶時,評論集合始終爲空,除非User_SubjectId列包含用戶的ID。

我的查詢是這樣的

return _context.Users 
       .Include(u => u.Reviews) 
       .Where(u => u.SubjectId.Equals(subjectId)); 

評論集合總是空

用戶審查實體

using System; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 

namespace API.Data.Entities 
{ 
    public class UserReview 
    { 
     [Key, Column(Order = 0), ForeignKey("Reviewer")] 
     public string ReviewerId { get; set; } //The user that wrote the review 

     [Key, Column(Order = 1), ForeignKey("ReviewedUser")] 
     public string ReviewedUserId { get; set; } //The user who was reviewed 

     [Required] 
     [Range(1, 5)] 
     public int Rating { get; set; } 

     [Required] 
     public DateTimeOffset DateCreated { get; set; } 

     [Required] 
     public virtual User Reviewer { get; set; } 

     [Required] 
     public virtual User ReviewedUser { get; set; } 
    } 
} 

用戶實體是這樣

public class User 
    { 
     [Key] 
     [Required] 
     public string SubjectId { get; set; } 

     public User() 
     {     
      Reviews = new List<UserReview>(); 
     } 

     public virtual ICollection<UserReview> Reviews { get; set; }  
    } 

然而,當我加入這個圖中顯示的另一列獲取我UserReviews表創建的遷移,列User_SubjectId

enter image description here

我不知道這是一個錯誤EF或我做了我的映射錯誤,無論如何有什麼想法?

謝謝

+0

您的未知列由User.Reviews屬性創建。您尚未映射其外鍵,因此EF將自動生成名稱。 – Kinetic

+0

你的意思是什麼沒有映射?查看我的UserReview實體,這兩個外鍵是否存在 –

+0

評論鏈接到哪一個外鍵? – Kinetic

回答

1

您必須使用ReverseProperty註釋。

public class UserReview 
{ 
    [Key, Column(Order = 0), ForeignKey("Reviewer")] 
    public string ReviewerId { get; set; } //The user that wrote the review 

    [Key, Column(Order = 1), ForeignKey("ReviewedUser")] 
    public string ReviewedUserId { get; set; } //The user who was reviewed 

    [Required] 
    [Range(1, 5)] 
    public int Rating { get; set; } 

    [Required] 
    public DateTimeOffset DateCreated { get; set; } 

    [Required] 
    public virtual User Reviewer { get; set; } 

    [Required)] 
    public virtual User ReviewedUser { get; set; } 
} 

public class User 
{ 
    [Key] 
    [Required] 
    public string SubjectId { get; set; } 

    public User() 
    {     
     Reviews = new List<UserReview>(); 
    } 

    [InverseProperty("ReviewedUser")] // or Reviewer. 
    public virtual ICollection<UserReview> Reviews { get; set; }  
} 

在我看來,這是使用流暢映射時更容易配置的那種東西。

+0

是的,我結束了使用流利的映射,但你的答案指出我在正確的方向。 –