2013-01-19 43 views
0

我想用ASP.NET MVC 4构建一个Web应用程序,但我一直在困难,而且我没有发现其他任何帮助。帖子:ASP.NET MVC 4 - 添加到列表时更新错误的对象

我有两个模型类参与:用户和组。用户可以按他们想要的方式进入多个组,并且一个组拥有用户列表(成员)。当用户创建一个组时,他成为这个组的所有者。

我的问题是,每当我尝试创建一个新组(并将当前用户添加到此新组的成员列表中)时,以前的组似乎会被修改,因为当前用户不再他以前创建的组的成员。

我希望我能够理解,如果不是,我很抱歉(英语不是我的母语)。

这里是模型类相关的我的问题: 类用户配置:

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

我在做什么错?

回答

0

我不能在这里发现任何明显错误的 - 但我想尝试并去除一些多余的代码,并改变用户得到FirstOrDefault()SingleOrDefault(),以确保你真的只有唯一的用户在你的数据库(你的关键是UserId但你得到用户名)。

GroupUser之间的许多一对多的关系,所以你只需要保持从一端,而不是两个的关系...

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

这可能不是解决你的问题,但使用较少的代码可能更容易找到。

+0

似乎没有工作: 使用此代码,isMember为false(id是我的groupId): var user = db.UserProfiles.SingleOrDefault(u => u.UserName == User.Identity.Name ); Group group = db.Groups.Find(id); var isMember = group.Members.Contains(user)' – 11OClock

+0

你使用延迟加载吗?如果不是那么你应该做一个'db.Groups.Include(“成员”)。找到(id)'成员集合被填充.... –

+0

我不使用延迟加载,但这个集合似乎被填充,因为添加了“group.Members.Add(anotherUser)”的成员出现在集合中。 似乎我有这个多对多关系的问题,因为'user.Groups.Add(group)'不会自动执行'group.Members.Add(user)'... – 11OClock