基于 IMLiviu 的回答和评论的非破坏性版本:
刚刚遇到这个问题,不得不从答案+评论(+反复试验)中解开正确的方法,所以我想我会分享你可以剪切和粘贴的结果。这是基于 IMLiviu 的回答,所以完全归功于他们。它会修改现有的UserProfile
和UserContext
类,因为它们看起来与 EF 直接兼容:
我很震惊地看到一个涉及完全删除数据库的建议,只是添加几个表,所以在阅读所有评论并创建原型之后,结果如下。
1 - 停止 Webmatrix 创建
停止成员表的标准 webmatrix 创建(注释掉 [InitializeSimpleMembership] 属性)。
[Authorize]
//[InitializeSimpleMembership]
public class AccountController : Controller
2 - 创建迁移配置
创建一个迁移配置类,如下所示:
public class MigrationConfiguration : DbMigrationsConfiguration<UsersContext>
{
public MigrationConfiguration()
{
this.AutomaticMigrationsEnabled = true; // This is important as it will fail in some environments (like Azure) by default
}
protected override void Seed(UsersContext context)
{
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
}
}
3 - 从 EF 创建中删除多元化
更改 AccountModel.cs 文件UsersContext
类以删除复数选项(添加 OnModelCreating 事件):
public class UsersContext : DbContext
{
public UsersContext() : base("DefaultConnection")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
4 - 向 UserProfile 添加新字段
将您需要的额外字段添加到 UserProfile:
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public string UserEmail { get; set; } // <<<<<<<< E.G. THIS ADDED
}
5 - 在应用启动时迁移表
现在,当应用程序启动时,您设置数据库初始化策略并通过读取触发它:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
Database.SetInitializer(new MigrateDatabaseToLatestVersion<UsersContext, MigrationConfiguration>());
new UsersContext().UserProfiles.Find(1);
}
显然,您将需要添加各种 using 语句才能使这一切正常工作,但右键单击解决选项将为您做到这一点。
补充笔记:
如果您决定(像我一样)使用除用户以外的表格UserProfile
,则需要更改几个条目以匹配。
- 在您的
SimpleMembershipInitializer
班级中,您需要引用新的表名和列名
- 在帐户控制器和各种登录和注册视图中,您需要引用您的新模型字段(如果名称已更改)
- 在
UsersContext
类中,您可以保留 Userprofile 类名,但您需要更改Table
属性以匹配您的表名。
- 在
UserProfile
类中,您需要重命名字段以匹配您的新表字段名称。
- 在数据库中,您需要删除和之间的关系,
webpages_UsersInRoles
并UserProfile
在新用户表和webpages_UsersInRoles
/或旧的引用完整性检查之间添加关系,这将在运行时破坏您。(我强烈建议您删除现有UserProfile
表并检查它是否没有重新创建。如果是您的代码中留下了一些东西)。