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

ASP.NET MVC 5 relationship one to one with ApplicationUser

我是 asp.net mvc 和 entity framework 的新手,所以我真的需要一些帮助。

我想将新的 class 实施到 IdentityUser class 中,并且具有一对一的关系。现在我有这个:

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

一切都很好,新的 table 已创建,但我怎样才能做到每次创建新用户时应用程序也会为两个属性创建默认值为 0 的 MapPosition 条目?

您可以在构造函数中完成:

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

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

将此视为工作流程问题。在您的应用程序工作流程中 "makes-sense" 创建从属 MapPosition 对象(现在需要用户交互和对象的地方)。这些类型的工作流就是 MVC 的全部内容。

用户参与是通过网页上的交互来引导的(例如单击 'Register' 新用户帐户 link)。此操作通常在您的 "AccountController" 中捕获为“// GET: /Account/Register”。用户被引导查看表格并输入所需信息以进行注册。然后在 post 上,服务器执行创建 ApplicationUser 的操作。然后,您可以在 returning 视图中,通过以下方式扩展工作流:

  • 在现有 "View" 上添加一个按钮以启动新的工作流程:"GET" 一个 "View" 坐标。
  • 通过从 RedirectToAction("Index", "Home") 扩充 return 来继续现有的工作流程;到不同的控制器,如 RedirectToAction("Cordinates", "MapPosition");

以上两项都需要您创建一个控制器来捕获此 "Get",并在该控制器内部确定 MapPosition 是否已创建,如果未创建则启动它。 returning 视图以起始地图位置之类的内容结束您的工作流程。