2012-06-30 5 views
5

estoy característica que permite a los usuarios siguen unos a otros en la ejecución. que tienen tablas de bases de datos:dos tipos de clase mismos en cuestión de clase marco de la entidad

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

por lo que añade la clase de 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; } 
    } 

Las dos últimas propiedades virtuales tema Couse. cuando llamo:

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

I Get siguiente excepción:

Invalid column name 'Following_UserId'. 

El problema se debe probablemente a causa de dos objetos de usuario en una clase. ¿Alguna idea de cómo solucionar esto?
ACTUALIZACIÓN

public class User 
    { 

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

no parece adecuado para que ponga tanto el ID de usuario y propiedad de navegación, debe poner solo uno de ellos, de lo contrario, EF no puede establecer la conexión entre ellos – Clueless

+0

¿Puede explicar mejor que no estoy seguro de cómo solucionarlo? – 1110

Respuesta

4

Creo que la razón es que las propiedades extranjeras clave (FollowerUserId y FollowUserId) y propiedades de navegación (Follower y Following) no respetan las convenciones de nomenclatura para que EF es incapaz de reconocer la primeras propiedades como claves foráneas Puede solucionar el problema mediante la especificación de las propiedades FK utilizando explícitamente el atributo [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; } 
} 

Editar

A menos la segunda propiedad no respeta la convención de nombres, el primero se ve bien. Así que, también, puede solucionar el problema cambiando el nombre de la segunda propiedad FK FollowUserId en:

public Guid FollowingUserId { get; set; }   

... porque la propiedad de navegación se llama Following.

Editar 2

Acerca de su ACTUALIZACIÓN: Es necesario añadir el atributo [InverseProperty] para contar EF, que las propiedades de navegación van de la mano:

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

Gracias esto resuelve mi problema en la siguiente clase. Sólo una cosa más, si no es un problema también he intentado añadir colección de seguidores/siguiendo a la clase de usuario (he añadido en mi actualización de interrogación) y de nuevo sale error similar: no válida nombre de la columna 'User_UserId'. – 1110

+0

@ 1110: vea mi edición 2. – Slauma

Cuestiones relacionadas