使用registerviewmodel

时间:2016-06-09 03:32:13

标签: entity-framework asp.net-mvc-5 ef-migrations

我希望每个用户都能连接到一个组织。我的组织在Organization.cs中定义

Organization.cs

  public class Organization
  {
    public int ID { get; set; }
    [Required]
    [StringLength(70, MinimumLength = 3)]
    public string Name { get; set; }
  }

AccountViewModel.cs

public class RegisterViewModel
{
  [Required]
  [Display(Name = "Username")]
  public string Username { get; set; }

  [Required]
  [EmailAddress]
  [Display(Name = "Email")]
  public string Email { get; set; }

  [Required]
  public Organization myOrganization { get; set; }

  /*Rest of Model*/

}

在我看来,我希望他们成为用户选择他们想要与其帐户关联的组织的下拉列表。

我应该像这样添加字段吗?

public Organization myOrganization { get; set; }

或者我应该接受组织的ID然后存储它?

我使用代码优先迁移,如果有人能够清理如何正确接收其他模型的对象并正确生成数据库表,我将不胜感激。

我最好的猜测是我的Organizations表和我的Users表将合并到UserOrganizations中,就像我的Roles和Users表合并到UserRoles中以连接它们一样。但是我对这一切都很陌生,所以我可能错了。

1 个答案:

答案 0 :(得分:1)

这取决于您是否要存储ID或名称,存储这两个属性将有点无意义。以下示例将存储Name.Also您应将此值存储到您的Account表(默认表是AspNetUsers),以便每个用户都与组织相关联。

您可以向AspNetUsers添加其他字段,请查看this,这非常有用。

在您的AccountViewModel中,应该有两个属性来完成任务:

1。)从组织表

中检索的组织名称列表

2。)从下拉列表中选择的“SelectedOrganizationName”

然后我假设在你的[HttpGet]控制器中你已经用组织表中的数据加载下拉列表。在[HttpPost]控制器上你会做这样的事情:

[HttpPost]
    public ActionResult Create(AccountViewModel avm)
    {                                      
            if (ModelState.IsValid)
            {
                //do add account here...
                dbcontext.SaveChanges();
                return RedirectToAction("Create");
            }
            return View(avm);
        }          
        return View(avm);
    }

然后在检索时,由于您的Account表具有OrganizationName属性,您可以使用AccountId检索整个对象。

[HttpGet]
public ActionResult Details(int id)
    {
        Users user = dbContext.Users.Find(id);
        return View(user);
    }

为了澄清一件事,为您自动创建的UserRoles表充当关联实体(用于解决用户和角色之间的多对多关系),但在您的情况下,用户和组织关系作为一对一存在一,因此您不需要拥有UserOrganizations表。