0

ASP.NET MVC 4を使用してWebアプリを構築しようとしていますが、しばらく立ち往生していて、他の投稿では何も役に立ちませんでした。

ユーザーとグループの2つのモデルクラスが関係しています。ユーザーは必要な数のグループに参加でき、グループにはユーザー(メンバー)のリストがあります。ユーザーがグループを作成すると、そのユーザーはこのグループの所有者になります。

私の問題は、新しいグループを作成しようとしている(そして現在のユーザーをこの新しいグループのメンバーリストに追加しようとしている)ときはいつでも、現在のユーザーはもはや彼のメンバーではないため、前のグループが変更されているように見えることです以前に作成されたグループ。

十分に理解できたと思いますが、理解できなかった場合は申し訳ありません(英語は私の母国語ではありません)。

これが私の質問に関連するモデルクラスです:クラスUserProfile:

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual List<Group> Groups { get; set; }
    public virtual List<Group> OwnedGroups { get; set; }
}

クラスグループ:

public class Group
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int GroupId { get; set; }

    [Required]
    public string Name { get; set; }

    public string Description { get; set; }

    public virtual List<UserProfile> Members { get; set; }

    public virtual UserProfile Owner { get; set; }

}

そして、私のメソッドは(GroupControllerで)新しいグループを作成するために使用されました:

[HttpPost]
    public ActionResult Create(Group group)
    {
        if (ModelState.IsValid)
        {
            UserProfile user = db.UserProfiles.Where(u => u.UserName == User.Identity.Name).FirstOrDefault();
            db.Groups.Add(group);
            db.SaveChanges();
            group.Owner = user;
            user.OwnedGroups.Add(group);
            user.Groups.Add(group);
            group.Members = new List<UserProfile>();
            group.Members.Add(user); 
            db.SaveChanges();

            return RedirectToAction("SearchUsersToAddToGroup", new { groupId = group.GroupId });
        }

私は何を間違っているのですか?

4

1 に答える 1

0

ここで明らかな間違いを見つけることはできません-しかし、冗長なコードをいくつか削除して、ユーザーの取得元を変更してFirstOrDefault()SingleOrDefault()データベースに一意のユーザーのみが存在することを確認します(キーはUserIdユーザー名ですが)。

Groupと の間には多対多の関係がUserあるため、両方ではなく一方の端からのみ関係を維持する必要があります...

[HttpPost]
public ActionResult Create(Group group)
{
    if (ModelState.IsValid)
    {
        // SingleOrDefault as you're not searching on the PK
        UserProfile user = db.UserProfiles.Where(u => u.UserName == User.Identity.Name).SingleOrDefault();

        group.Owner = user;
        db.Groups.Add(group);

        user.Groups.Add(group);
        user.OwnedGroups.Add(group);

        db.SaveChanges();

        return RedirectToAction("SearchUsersToAddToGroup", new { groupId = group.GroupId });
    }

これで問題が解決するわけではありませんが、コードが少ないと見つけやすくなります。

于 2013-01-19T13:08:14.100 に答える