ASP.NET MVC 5与ApplicationUser的关系一对一

时间:2015-06-25 15:31:44

标签: asp.net-mvc entity-framework asp.net-mvc-5 asp.net-identity asp.net-identity-2

我是asp.net mvc和实体框架的新手,所以我真的可以使用一些帮助。

我希望将新类实现到IdentityUser类中,并且关系一对一。现在我有这个:

public class ApplicationUser : IdentityUser
{
    public virtual MapPosition MapPosition { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<MapPosition> MapPositions { get; set; }

    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

public class MapPosition
{
    [Key, ForeignKey("ApplicationUser")]
    public string UserId { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }

    public int PositionX { get; set; }
    public int PositionY { get; set; }
}

一切都很棒,已经创建了新表但是我怎样才能创建新用户每次创建新用户应用程序还会为两个属性创建默认值为0的MapPosition条目?

2 个答案:

答案 0 :(得分:0)

您可以在构造函数中执行此操作:

public ApplicationUser()
{
    MapPosition = new MapPosition { PositionX = 0, PositionY  = 0 };
}

我更喜欢在控制器上的Create操作中构建视图模型并在那里处理它。然后在更新之前使用AutoMapper复制到实体中。 http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

答案 1 :(得分:0)

考虑此工作流程问题。当下级MapPosition对象在您的应用程序工作流程中进行“ makes-sense”(需要用户进行交互并且现在需要该对象)时,请创建该对象。这些类型的工作流就是MVC的全部意义所在。

用户互动是通过网页上的互动(例如,点击“注册”新用户帐户链接)进行的。此操作通常在您的“ AccountController”中捕获为“ // GET:/ Account / Register”。指导用户查看表格并将所需信息放入注册表中。然后,在发布时,服务器会做一些事情来创建ApplicationUser。然后,您可以在返回的视图上通过以下方式扩展工作流程:

  • 在现有的“视图”上添加一个按钮以启动新的工作流程:“获取”坐标的“视图”。
  • 通过增加RedirectToAction(“ Index”,“ Home”)的返回值来继续现有工作流程;到另一个控制器,例如RedirectToAction(“ Cordinates”,“ MapPosition”);

以上两种方法都要求您创建一个控制器来捕获此“ Get”,并在该控制器内确定是否已创建MapPosition,如果尚未创建,则将其初始化。返回的视图以类似起始地图位置的形式结束工作流程。