【问题标题】:ASP.NET MVC 5 relationship one to one with ApplicationUserASP.NET MVC 5 与 ApplicationUser 一对一的关系
【发布时间】:2015-09-12 07:36:08
【问题描述】:

我是 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 条目?

【问题讨论】:

  • 如果UserId 也是Key 对应MapPosition,为什么不将ApplicationUser 中的两个属性移动?
  • 因为我打算开更多这样的课,我不想把所有东西都放在一个课上。

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


【解决方案1】:

你可以在构造函数中做到这一点:

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

【讨论】:

  • 这是一个不好的方法。起初,它违反了Single Responsibility Principle。您强制 ApplicationUser 类负责构建链接的 MapPosition 实例及其自己的角色。其次,您会遇到一个问题,即 Entity Framework 不会从数据库中加载链接的实体 MapPosition 实例 - 您可以阅读更多详细信息 here
  • 这就是为什么我说你“可以”在构造函数中这样做,但首选方法是通过视图模型分离关注点。我想我应该花更多的时间来澄清。
【解决方案2】:

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

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

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

以上两种方法都需要您创建一个控制器来捕获此“获取”,并在该控制器内部确定是否已创建 MapPosition,以及是否启动它。返回的视图以起始地图位置之类的内容结束您的工作流程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多