5

Quando provo a fare Update-Database, ottengo questo errore:La struttura di navigazione 'SenderId' non è una proprietà dichiarata del tipo 'conversazione'

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.

Modifica

Credo problema è nella mappatura delle relazioni tra conversazione e utente, perché conversazione e utente sono connessi con due uno a molti rapporti cioè Conversazione ha due chiavi esterne che puntano a Utente

Ecco come Utente e conversazione sono connessi:

utente:

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

Conversazione:

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

} 

Ecco il codice intero:

utente:

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

Conversazione:

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

Messaggio

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

risposta

5

Finalmente ho trovato soluzione, stupido errore. In Conservazione dovrebbe essere

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

    public Guid SenderId { get; set; } 

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

    public Guid ReceiverId { get; set; } 

E non

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

Dopo di che ho ottenuto l'errore:

"Introduzione vincolo FOREIGN KEY 'FK_dbo.Conversations_dbo.Users_ReceiverId' sul tavolo 'Conversazioni' possa causare cicli o più percorsi a cascata Specificare ON DELETE NO ACTION o ON UPDATE NO ACTION o modificare altri vincoli FOREIGN KEY. Impossibile creare il vincolo. Vedere errori precedenti. "

e la soluzione è: in DbContext questo codice:

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

ho provato e ora tutto funziona bene =)

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

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

questi due linea erroneamente contrassegnata con [DatabaseGenerated(DatabaseGeneratedOption.Identity)] attribute.remove questi due attributi dalla versione properties.corrected dovrebbe essere:

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

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

li ho rimossi, ma ancora lo stesso errore – hyperN

+0

Puoi pubblicare il codice per il mittente e Ricevitore pure? –

+0

@ Behnam Esmaili Sender e Receiver sono in realtà User, ci sono due connessioni da 1 a molte da Conversation a User, puoi cercarle nel codice, ma qui troverò quella parte esatta, quindi sarò più facile leggi il codice: Utente 'public virtual ICollection ConversationSenders {get; impostato; } pubblico virtuale ICollection ConversazioneRecievers {get; impostato; } ' – hyperN