我是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条目?
您可以在构造函数中完成:
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
考虑此工作流程问题。当下级MapPosition对象在您的应用程序工作流程中进行“ makes-sense”(需要用户进行交互且现在需要该对象)时,创建该对象。这些类型的工作流就是MVC的全部意义所在。
[用户参与是通过网页上的交互(例如,点击“注册”新用户帐户链接”来指导的)。此操作通常在您的“ AccountController”中捕获为“ // GET:/ Account / Register”。指导用户查看表单并将所需信息放入注册表中。然后在发布时,服务器会做一些事情来创建ApplicationUser。然后,您可以在返回的视图上通过以下方式扩展工作流程:
以上两者都需要您创建一个控制器来捕获此“ Get”,并在该控制器内部确定是否已创建MapPosition,如果尚未创建,则将其初始化。返回的视图以类似起始地图位置的形式结束工作流程。