3

EF4 自己追跡エンティティの使用。

ユーザーが所属できる「グループ」のコレクションを持つ「ユーザー」エンティティがあります。グループ ID のリストだけを指定して、このユーザーにいくつかの「グループ」を追加/削除したいと考えています。

    public void UserAddGroups(int userID, List<int> groups)
    {
        var user = Context.Users.Include("Groups").FirstOrDefault(u => u.ID == userID);
        if (user != null)
        {
            // Iterate through the groups that the user already belongs to.
            foreach (var group in user.Groups.ToList())
            {
                // Remove any groups from the user if the new list does not have it.
                if (!groups.Contains(group.ID)) user.Groups.Remove(group);
                // Else remove it from the list of new groups to avoid duplication.
                else groups.Remove(group.ID);
            }
            // Iterate through the group list and add it to the user's list
            // (only a stubby is created)
            foreach (var group in groups) user.Groups.Add(new Group { ID = group }.MarkAsUnchanged());
            Context.Users.ApplyChanges(user);
            Context.SaveChanges();
        }
    }

このメソッドの結果は、でエラーをスローしますContext.SaveChanges()nullエラーは、「グループ」エンティティがプロパティを許可しないことを報告しNameます。

これは、新しいグループをINSERTING している場合に予想されますが、明らかに私がやろうとしていることではありません。この問題を解決するにはどうすればよいですか?

4

2 に答える 2

2

あなたは実際に挿入しています。新しいグループを作成し、それを essense のコレクションに追加することで、ここに新しいグループが追加されます。追跡を有効にするには、最初にデータベースからグループをロードする必要があります。次に、そのグループをユーザー グループ コレクションに追加します。

amit_g のソリューションは機能しますが、複数の DB 呼び出しが発生します (グループごとに 1 つの DB 呼び出し)。すべてのグループを事前にロードします

于 2011-03-16T00:45:38.993 に答える
1

で試してみてください

user.Groups.Add(Context.Groups.FirstOrDefault(g => g.ID == group));
于 2011-03-15T23:00:46.883 に答える