导航属性“SenderId”不是对类型'对话'声明的属性 [英] The navigation property 'SenderId' is not a declared property on type 'Conversation'

查看:151
本文介绍了导航属性“SenderId”不是对类型'对话'声明的属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  

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

修改

我认为问题出在会话和用户之间的映射关系,因为会话和用户与两个一对多关系进行连接,即对话有两个外键指向用户

下面是如何使用和会话连接:

网友:

 公共类用户
{
    [键]
    [HiddenInput(DisplayValue = FALSE)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)
    公众的Guid用户ID {获得;组; }

    公共虚拟的ICollection<会话> ConversationSenders {获得;组; }
    公共虚拟的ICollection<会话> ConversationRecievers {获得;组; }
 

对话:

 公共类谈话
{
    [键]
    [HiddenInput(DisplayValue = FALSE)]
    公众的Guid的conversationId {获得;组; }

    [ForeignKey的(SenderId)]
    公众的Guid SenderId {获得;组; }

    [ForeignKey的(RecieverId)]
    公众的Guid RecieverId {获得;组; }

    [InverseProperty(ConversationSenders)]
    公共虚拟用户发送{获得;组; }

    [InverseProperty(ConversationRecievers)]
    公共虚拟用户Reciever {获得;组; }

}
 

下面是整个code:

网友:

 公共类用户
{
    [键]
    [HiddenInput(DisplayValue = FALSE)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)
    公众的Guid用户ID {获得;组; }


    [DatabaseGenerated(DatabaseGeneratedOption.Identity)
    公众的Guid CollegeId {获得;组; }

    公众诠释RoleId {获得;组; }

    [需要]
    [数据类型(DataType.EmailAddress)
    公共字符串电子邮件{获得;组; }

    [需要]
    [数据类型(DataType.Password)
    公共字符串密码{获得;组; }

    [需要]
    公共字符串名称{;组; }

    [需要]
    公共字符串姓{获得;组; }

    公共字符串性别{获得;组; }

    //角色

    公开日期时间? DATEOFBIRTH {获得;组; }


    公共字符串IMAGEURL {获得;组; }

    [ForeignKey的(CollegeId)]
    公共虚拟大学学院{获得;组; }

    [ForeignKey的(RoleId)]
    公共虚拟UserRole UserRole {获得;组; }

    公共虚拟的ICollection<广告>广告{获得;组; }
    公共虚拟的ICollection<竞争与GT;比赛{获得;组; }
    公共虚拟的ICollection<消息>消息{获得;组; }
    公共虚拟的ICollection<会话> ConversationSenders {获得;组; }
    公共虚拟的ICollection<会话> ConversationRecievers {获得;组; }
    公共虚拟的ICollection< UserOS> UserOses {获得;组; }
 

对话:

 公共类谈话
{
    [键]
    [HiddenInput(DisplayValue = FALSE)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)
    公众的Guid的conversationId {获得;组; }

    [ForeignKey的(SenderId)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)
    公众的Guid SenderId {获得;组; }

    [ForeignKey的(RecieverId)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)
    公众的Guid RecieverId {获得;组; }

    [InverseProperty(ConversationSenders)]
    公共虚拟用户发送{获得;组; }

    [InverseProperty(ConversationRecievers)]
    公共虚拟用户Reciever {获得;组; }

    公共虚拟的ICollection<消息>消息{获得;组; }
}
 

信息

 公共类信息
{
    [键]
    [HiddenInput(DisplayValue = FALSE)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)
    公众的Guid的MessageId {获得;组; }

    [HiddenInput(DisplayValue = FALSE)]
    公众的Guid用户ID {获得;组; }

    [HiddenInput(DisplayValue = FALSE)]
    公众的Guid的conversationId {获得;组; }

    公共字符串文本{获得;组; }

    公共BOOL? IsSeen {获得;组; }


    [ForeignKey的(用户ID)
    公共虚拟用户ConversationSender {获得;组; }

    [ForeignKey的(的conversationId)
    公共虚拟会话交谈{获得;组; }
}
 

解决方案

最后,我已经找到解决方案,愚蠢的错误。在保护它应该是

  [ForeignKey的(发件人),列(ORDER = 0)]

    公众的Guid SenderId {获得;组; }

    [ForeignKey的(接收器),列(ORDER = 1)]

    公众的Guid ReceiverId {获得;组; }
 

和不

  [ForeignKey的(SenderId),列(ORDER = 0)]
[ForeignKey的(ReceiverId),列(ORDER = 1)]
 

之后,我得到了错误:

引进国外KEY约束对表'对话'FK_dbo.Conversations_dbo.Users_ReceiverId可能会导致循环或多重级联路径。指定ON DELETE NO行动或UPDATE NO ACTION或修改另一个外键约束。 无法创建约束。见previous错误。

和解决方法是:在此的DbContext code:

  modelBuilder.Entity<会话>()
           .HasRequired(S => s.Sender)
           .WithMany(S => s.ConversationSenders)
           .HasForeignKey(S => s.SenderId)
           .WillCascadeOnDelete(假);


        modelBuilder.Entity<会话>()
            .HasRequired(R => r.Receiver)
            .WithMany(R => r.ConversationReceivers)
            .HasForeignKey(R => r.ReceiverId)
            .WillCascadeOnDelete(假);
 

我测试过它,现在一切工作正常=)

When I try to do Update-Database, I get this error:

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.

Edit

I believe problem is in mapping relations between Conversation and User, because Conversation and User are connected with two one to many relationships i.e. Conversation has two foreign keys pointing to User

Here is how User and Conversation are connected:

User:

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

Conversation:

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

}

Here is whole code:

User:

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

Conversation:

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

Message

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

解决方案

Finally I've found solution, stupid mistake. In Conservation it should be

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

    public Guid SenderId { get; set; }

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

    public Guid ReceiverId { get; set; }

And not

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

After that I got error:

"Introducing FOREIGN KEY constraint 'FK_dbo.Conversations_dbo.Users_ReceiverId' on table 'Conversations' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors."

And solution is: in DbContext this code:

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

I've tested it and now everything works fine =)

这篇关于导航属性“SenderId”不是对类型'对话'声明的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆