5

ユーザーがお互いをフォローできる機能を実装しています。私はデータベーステーブルを持っています:

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

最後の2つの仮想プロパティは問題を引き起こします。私が電話するとき:

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

次の例外が発生します:

Invalid column name 'Following_UserId'.

この問題は、1つのクラスに2つのUserオブジェクトが含まれていることが原因である可能性があります。これを回避する方法はありますか?
アップデート

public class User
    {

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

1 に答える 1

4

その理由は、外部キープロパティ(FollowerUserIdおよびFollowUserId)とナビゲーションプロパティ(FollowerおよびFollowing)が命名規則を尊重しないため、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; }
}

編集

少なくとも2番目のプロパティは命名規則を尊重していません。最初のプロパティは問題ないように見えます。したがって、代わりに、2番目の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; }
}
于 2012-06-30T11:07:19.320 に答える