5

當我嘗試做更新的數據庫,我得到這個錯誤:的導航屬性「SenderId」不在類型「對話」聲明的屬性

The navigation property 'SenderId' is not a declared property on type 'Conversation'. Verify that it has not been explicitly excluded from the model and that it is a valid navigation property.

編輯

我相信問題是因爲會話和用戶之間存在映射關係,因爲會話和用戶通過兩個一對多關係連接,即對話有兩個指向用戶的外鍵:

以下是用戶和對話連接的方式:

用戶:

public class User 
{ 
    [Key] 
    [HiddenInput(DisplayValue = false)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid UserId { get; set; } 

    public virtual ICollection<Conversation> ConversationSenders { get; set; } 
    public virtual ICollection<Conversation> ConversationRecievers { get; set; } 

對話:

public class Conversation 
{ 
    [Key] 
    [HiddenInput(DisplayValue = false)] 
    public Guid ConversationId { get; set; } 

    [ForeignKey("SenderId")] 
    public Guid SenderId { get; set; } 

    [ForeignKey("RecieverId")] 
    public Guid RecieverId { get; set; } 

    [InverseProperty("ConversationSenders")] 
    public virtual User Sender { get; set; } 

    [InverseProperty("ConversationRecievers")] 
    public virtual User Reciever { get; set; } 

} 

這裏是整個代碼:

用戶:

public class User 
{ 
    [Key] 
    [HiddenInput(DisplayValue = false)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid UserId { get; set; } 


    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid CollegeId { get; set; } 

    public int RoleId { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    public string Email { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    public string Password { get; set; } 

    [Required] 
    public string Name { get; set; } 

    [Required] 
    public string Surname { get; set; } 

    public string Gender { get; set; } 

    //role 

    public DateTime? DateOfBirth { get; set; } 


    public string ImageURL { get; set; } 

    [ForeignKey("CollegeId")] 
    public virtual College College { get; set; } 

    [ForeignKey("RoleId")] 
    public virtual UserRole UserRole { get; set; } 

    public virtual ICollection<Advert> Adverts { get; set; } 
    public virtual ICollection<Competition> Competitions { get; set; } 
    public virtual ICollection<Message> Messages { get; set; } 
    public virtual ICollection<Conversation> ConversationSenders { get; set; } 
    public virtual ICollection<Conversation> ConversationRecievers { get; set; } 
    public virtual ICollection<UserOS> UserOses { get; set; } 

對話:

public class Conversation 
{ 
    [Key] 
    [HiddenInput(DisplayValue = false)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid ConversationId { get; set; } 

    [ForeignKey("SenderId")] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid SenderId { get; set; } 

    [ForeignKey("RecieverId")] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid RecieverId { get; set; } 

    [InverseProperty("ConversationSenders")] 
    public virtual User Sender { get; set; } 

    [InverseProperty("ConversationRecievers")] 
    public virtual User Reciever { get; set; } 

    public virtual ICollection<Message> Messages { get; set; } 
} 

消息

public class Message 
{ 
    [Key] 
    [HiddenInput(DisplayValue = false)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid MessageId { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public Guid UserId { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public Guid ConversationId { get; set; } 

    public string Text { get; set; } 

    public bool? IsSeen { get; set; } 


    [ForeignKey("UserId")] 
    public virtual User ConversationSender { get; set; } 

    [ForeignKey("ConversationId")] 
    public virtual Conversation Conversation { get; set; } 
} 

回答

5

最後我發現解決方案,愚蠢的錯誤。在保護它應該是

[ForeignKey("Sender"), Column(Order = 0)] 

    public Guid SenderId { get; set; } 

    [ForeignKey("Receiver"), Column(Order = 1)] 

    public Guid ReceiverId { get; set; } 

而且不

[ForeignKey("SenderId"), Column(Order = 0)] 
[ForeignKey("ReceiverId"), Column(Order = 1)] 

我得到了錯誤之後:

「上表引進國外KEY約束'FK_dbo.Conversations_dbo.Users_ReceiverId '對話' 可能會導致循環或多個級聯路徑指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束 無法創建約束,請參閱前面的錯誤。

而解法是:在此的DbContext代碼:

 modelBuilder.Entity<Conversation>() 
      .HasRequired(s => s.Sender) 
      .WithMany(s => s.ConversationSenders) 
      .HasForeignKey(s => s.SenderId) 
      .WillCascadeOnDelete(false); 


     modelBuilder.Entity<Conversation>() 
      .HasRequired(r => r.Receiver) 
      .WithMany(r => r.ConversationReceivers) 
      .HasForeignKey(r => r.ReceiverId) 
      .WillCascadeOnDelete(false); 

我測試過它,現在一切工作正常=)

0
[ForeignKey("SenderId")] 
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Guid SenderId { get; set; } 

[ForeignKey("RecieverId")] 
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Guid RecieverId { get; set; } 

這兩條線段誤標有[DatabaseGenerated(DatabaseGeneratedOption.Identity)] attribute.remove從properties.corrected版這兩個屬性應該是:

[ForeignKey("User")]  
public Guid SenderId { get; set; } 

[ForeignKey("User")] 
public Guid RecieverId { get; set; } 
+0

我刪除他們,但還是同樣的錯誤 – hyperN

+0

您可以發佈代碼發送方和接收器呢? –

+0

@ Behnam Esmaili 發件人和收件人實際上是用戶,從對話到用戶有兩個一對多的連接,你可以在代碼中查找它們,但我會在這裏註明確切的部分,所以我會更容易閱讀代碼: 用戶 '公共虛擬ICollection <對話> ConversationSenders {get;組; } public virtual ICollection ConversationRecievers {get;組; } ' – hyperN