实体框架类中的两个相同的类类型问题

时间:2012-06-30 09:21:33

标签: c# entity-framework entity-framework-4.1

我正在实现允许用户互相关注的功能。 我有数据库表:

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

所以我添加了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; }
    }

最后两个虚拟属性问题。 我打电话的时候:

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

我得到以下例外:

Invalid column name 'Following_UserId'.

问题可能是由于一个类中有两个User对象引起的。知道如何解决这个问题吗?
更新

public class User
    {

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

1 个答案:

答案 0 :(得分:4)

我认为原因是外键属性(FollowerUserIdFollowUserId)和导航属性(FollowerFollowing)不遵守命名约定,因此EF无法将第一个属性识别为外键。您可以通过使用[ForeignKey]属性明确指定FK属性来解决问题:

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

修改

至少第二个属性不遵守命名约定,第一个属性看起来没问题。因此,您也可以通过将第二个FK属性FollowUserId重命名为:

来解决问题
public Guid FollowingUserId { get; set; }        

...因为导航属性称为Following

修改2

关于您的更新:您需要添加[InverseProperty]属性以告知EF哪些导航属性属于一起:

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