【问题标题】:The navigation property 'SenderId' is not a declared property on type 'Conversation'导航属性“SenderId”不是“对话”类型的声明属性
【发布时间】:2012-11-26 05:40:11
【问题描述】:

当我尝试更新数据库时,我得到这个错误:

导航属性“SenderId”不是“对话”类型的声明属性。验证它没有被明确地从模型中排除,并且它是一个有效的导航属性。

编辑

我认为问题在于对话和用户之间的映射关系,因为对话和用户之间存在两个一对多关系,即对话有两个指向用户的外键

以下是用户和对话的连接方式:

用户:

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

【问题讨论】:

    标签: .net entity-framework ef-code-first database-migration entity-framework-migrations


    【解决方案1】:
    [ForeignKey("SenderId")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid SenderId { get; set; }
    
    [ForeignKey("RecieverId")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid RecieverId { get; set; }
    

    这两行错误地标记了[DatabaseGenerated(DatabaseGeneratedOption.Identity)]属性。从属性中删除这两个属性。更正的版本应该是:

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

    【讨论】:

    • @ Behnam Esmaili Sender 和 Receiver 实际上是 User,从 Conversation 到 User 有两个一对多的连接,您可以在代码中查找它们,但我会在此处详细说明该部分,所以我阅读代码会更容易:用户public virtual ICollection&lt;Conversation&gt; ConversationSenders { get; set; } public virtual ICollection&lt;Conversation&gt; ConversationRecievers { get; set; }
    • @Behnam Esmail 对话[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; }
    • @hyperN 我已经编辑了 post.check 并告诉我解决了吗?
    【解决方案2】:

    我终于找到了解决方案,愚蠢的错误。在保护中应该是

        [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)]
    

    之后我得到了错误:

    “在表 'Conversations' 上引入 FOREIGN 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);
    

    我已经测试过了,现在一切正常 =)

    【讨论】:

      猜你喜欢
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多