2012-06-30 17 views
5

Wprowadzam funkcję, która pozwala użytkownikom na podążanie za sobą. Mam tabele bazy danych:Dwa typy tej samej klasy w klasie obiektu encja

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

Więc dodałem EF Klasa:

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

Dwie ostatnie właściwości wirtualne Couse problem. Kiedy zadzwonić:

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

dostaję następujący wyjątek:

Invalid column name 'Following_UserId'. 

Problem jest prawdopodobnie spowodowany z powodu dwóch obiektów użytkownika w jednej klasie. Każdy pomysł, jak to obejść?
UPDATE

public class User 
    { 

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

nie wydaje się w porządku dla mnie, aby umieścić zarówno userID i właściwość nawigacji, powinieneś umieścić tylko jeden z nich, w przeciwnym razie EF nie może nawiązać połączenia między nimi – Clueless

+0

Czy możesz wyjaśnić lepiej Nie jestem pewien, jak to naprawić? – 1110

Odpowiedz

4

Myślę, że powodem jest to, że zagraniczne nieruchomości kluczowe (FollowerUserId i FollowUserId) i właściwości nawigacyjnych (Follower i Following) nie przestrzega konwencji nazewnictwa tak, że EF jest w stanie rozpoznać pierwsze właściwości jako klucze obce. Można rozwiązać ten problem poprzez określenie właściwości FK jawnie przy użyciu atrybutu [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; } 
} 

Edycja

najmniej druga nieruchomość nie przestrzega konwencji nazewnictwa, pierwszy wygląda OK. Tak, alternatywnie można rozwiązać ten problem przez zmianę nazwy drugą właściwość FK FollowUserId do:

public Guid FollowingUserId { get; set; }   

... ponieważ nieruchomość nawigacji nazywa Following.

Edycja 2

O swojej UPDATE: Trzeba dodać atrybut [InverseProperty] powiedzieć EF które właściwości nawigacyjnych Belong Together:

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

Dzięki temu rozwiązuje mój problem w następnej klasie. Jeszcze tylko jedna rzecz, jeśli to nie jest problem. Próbowałem także dodać kolekcję obserwujących/obserwujących do klasy użytkownika (dodałem ją do mojej aktualizacji pytań) i ponownie otrzymuję podobny błąd: Niepoprawna nazwa kolumny "User_UserId". – 1110

+0

@ 1110: Zobacz moją edycję 2. – Slauma

Powiązane problemy