2012-06-30 11 views
5

Sto implementando una funzionalità che consente agli utenti di seguirsi l'un l'altro. devo tabelle del database:Due stessi tipi di classe nel numero di classe di entità entità

User{UserId, FirstName, LastName etc.} 
Followings{FollowerUserId, FollowingUserId, CreatedOnDate etc.} 

così ho aggiunto classe EF:

public class Follow 
    { 
     [Key, Column(Order = 1)] 
     public Guid FollowerUserId { get; set; } 
     [Key, Column(Order = 2)] 
     public Guid FollowUserId { get; set; }   
     public DateTime CreatedOnDate { get; set; } 

     public virtual User Follower { get; set; } 
     public virtual User Following { get; set; } 
    } 

Le ultime due proprietà virtuali problema couse. Quando chiamo:

var model = con.Follows.Where(x => x.FollowerUserId == uid); 

vengo seguente eccezione:

Invalid column name 'Following_UserId'. 

Il problema è causato probabilmente a causa di due oggetti Utente in una classe. Qualche idea su come risolvere questo?
UPDATE

public class User 
    { 

     public Guid UserId { get; set; } 
     ... 
     public virtual ICollection<Follow> Following { get; set; } 
     public virtual ICollection<Follow> Followers { get; set; } 
    } 
+0

non mi sembra giusto per me di mettere sia il userID e la proprietà di navigazione, dovresti metterne solo uno, altrimenti EF non può stabilire la connessione tra loro – Clueless

+0

Puoi spiegare meglio non so come risolvere questo problema? – 1110

risposta

4

Penso che il motivo è che le proprietà straniere chiave (FollowerUserId e FollowUserId) e le proprietà di navigazione (Follower e Following) non rispettano le convenzioni di denominazione in modo che EF è in grado di riconoscere il prime proprietà come chiavi esterne. È possibile risolvere il problema specificando le proprietà FK esplicitamente che utilizzano l'attributo [ForeignKey]:

public class Follow 
{ 
    [Key, Column(Order = 1), ForeignKey("Follower")] 
    public Guid FollowerUserId { get; set; } 
    [Key, Column(Order = 2), ForeignKey("Following")] 
    public Guid FollowUserId { get; set; }   

    public DateTime CreatedOnDate { get; set; } 

    public virtual User Follower { get; set; } 
    public virtual User Following { get; set; } 
} 

Modifica

Un almeno la seconda proprietà non rispetta la convenzione di denominazione, il primo sembra OK. Così, in alternativa, è possibile risolvere il problema rinominando la seconda proprietà FK FollowUserId in:

public Guid FollowingUserId { get; set; }   

... perché la proprietà di navigazione è chiamato Following.

Edit 2

Informazioni sul UPDATE: È necessario aggiungere l'attributo [InverseProperty] per dire che EF proprietà di navigazione vanno di pari passo:

public class Follow 
{ 
    [Key, Column(Order = 1), ForeignKey("Follower")] 
    public Guid FollowerUserId { get; set; } 
    [Key, Column(Order = 2), ForeignKey("Following")] 
    public Guid FollowUserId { get; set; }   

    public DateTime CreatedOnDate { get; set; } 

    [InverseProperty("Followers")] // refers to Followers in class User 
    public virtual User Follower { get; set; } 
    [InverseProperty("Following")] // refers to Following in class User 
    public virtual User Following { get; set; } 
} 
+0

Grazie a ciò risolve il mio problema in follow class. Ancora una cosa, se non è un problema, ho anche provato ad aggiungere la raccolta dei seguenti/follower alla classe User (l'ho aggiunta alla mia domanda di aggiornamento) e ottengo ancora un errore simile: Nome colonna non valido 'User_UserId'. – 1110

+0

@ 1110: vedere la mia modifica 2. – Slauma

Problemi correlati