2012-06-30 19 views
5

Tôi đang triển khai tính năng cho phép người dùng theo dõi nhau. Tôi có bảng cơ sở dữ liệu:Hai loại lớp giống nhau trong vấn đề lớp khung thực thể

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

Vì vậy, tôi đã thêm EF lớp:

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

Hai thuộc tính ảo cuối cùng vấn đề couse. Khi tôi gọi:

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

tôi nhận được sau ngoại lệ:

Invalid column name 'Following_UserId'. 

Vấn đề này có lẽ gây ra vì hai đối tượng người dùng trong một lớp. Bất kỳ ý tưởng làm thế nào để workaround này?
CẬP NHẬT

public class User 
    { 

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

nó dường như không phù hợp với tôi để đưa cả userID và thuộc tính điều hướng, bạn chỉ nên đặt một trong số chúng, nếu không EF không thể tạo kết nối giữa chúng – Clueless

+0

Bạn có thể giải thích tốt hơn Tôi không biết cách sửa lỗi này? – 1110

Trả lời

4

Tôi nghĩ lý do là các thuộc tính nước ngoài chủ chốt (FollowerUserIdFollowUserId) và tài sản chuyển hướng (FollowerFollowing) không tôn trọng quy ước đặt tên sao cho EF là không thể nhận ra thuộc tính đầu tiên là khóa ngoài. Bạn có thể khắc phục vấn đề bằng cách xác định các thuộc tính FK một cách rõ ràng bằng cách sử dụng thuộc tính [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; } 
} 

Sửa

Một ít nhất là bất động sản thứ hai không tôn trọng quy ước đặt tên, là người đầu tiên có vẻ OK. Vì vậy, cách khác bạn có thể khắc phục vấn đề bằng cách đổi tên thứ hai sở hữu FollowUserId FK thành:

public Guid FollowingUserId { get; set; }   

... bởi vì tài sản chuyển hướng được gọi là Following.

Chỉnh sửa 2

Về CẬP NHẬT của bạn: Bạn cần phải thêm thuộc tính [InverseProperty] nói với EF mà tính chuyển hướng thuộc về nhau:

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

Cảm ơn bạn đã giải quyết được vấn đề của tôi trong lớp học tiếp theo. Chỉ cần một điều nữa nếu nó không phải là một vấn đề tôi cũng đã cố gắng để thêm bộ sưu tập theo dõi/người theo lớp người dùng (tôi thêm nó trong bản cập nhật câu hỏi của tôi) và tôi lại gặp lỗi tương tự: Tên cột không hợp lệ 'User_UserId'. – 1110

+0

@ 1110: Xem Chỉnh sửa 2 của tôi. – Slauma

Các vấn đề liên quan