我的 global.asax 文件中有两个数据库初始化程序。
一个,它应该使用相关表创建我的数据库,第二个它初始化简单成员资格所需的所有表。
我遇到的问题是应该创建我的数据库的第一个初始化方法没有做任何事情(至少看起来是这样)。简单的成员初始化程序工作正常。
我想从我的上下文创建的表只有在我的存储库类中创建上下文的新实例时才会创建。然后这会失败,因为它试图创建一个已经存在的用户配置文件表,因为WebSecurity.InitialiseDatabaseConnection
初始化程序已经创建了它?
关于为什么在存储库方法中创建上下文之前不执行第一个数据库初始化程序的任何想法?
该数据库是 SQL Server LocalDB。
这是我的Application_Start
方法Global.asax.cs
:
protected void Application_Start()
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
WebSecurity.InitializeDatabaseConnection("MyDb", "UserProfile", "UserId", "UserName", autoCreateTables: true);
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
}
这是上下文类:
public class MyContext : DbContext
{
public MyContext()
: base("name=MyDb")
{
}
public DbSet<MyEntity> myEntity{ get; set; }
public DbSet<UserProfile> UserProfiles { get; set; }
}
这是存储库方法:
using (var db = new MyContext())
{
var user = _userRepository.GetUserByUserName(userName);
db.UserProfiles.Attach(user);
if (rack.Id == 0)
{
rack.DateAdded = DateTime.Now;
rack.AddedBy = user;
db.MyEntity.Attach(rack);
db.Entry(rack).State = EntityState.Added;
db.SaveChanges();
}
else
{
db.MyEntity.Attach(rack);
db.Entry(rack).State = EntityState.Modified;
db.SaveChanges();
}
}
编辑: 我已将 SimpleMembership 初始化程序移至我的配置类的种子方法,如下所示,虽然这解决了以正确顺序创建表的问题,但我仍然不知道为什么数据库没有得到在Application_Start
方法中调用初始化程序时初始化
protected override void Seed(RackTrackContext context)
{
WebSecurity.InitializeDatabaseConnection("MyDb", "UserProfile", "UserId", "UserName", autoCreateTables: true);
if (!Roles.RoleExists("Administrator"))
Roles.CreateRole("Administrator");
if (!WebSecurity.UserExists("User1"))
WebSecurity.CreateUserAndAccount(
"User1",
"CodeMonkey"
);
if (!Roles.GetRolesForUser("User1").Contains("Administrator"))
Roles.AddUsersToRoles(new[] { "User1" }, new[] { "Administrator" });
}
编辑二:
为了让它工作,我在 Application_start 方法中创建了一个新的上下文,并从数据库中检索了一个结果。然后在我希望应用它们的阶段应用迁移。
它很乱,很丑陋,也不会赢得任何奖项,但是嘿,它很管用,而且这样做时没有动物受到伤害,所以就这样吧。
protected void Application_Start()
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
//this code is here to ensure that the context is created and migrations applied,
//prior to the user seeing the start screen for the app. Must be a better way of doing it....
using (var db = new MyContext())
{
var results = db.MyEntity.FirstOrDefault();
}
如果有人能告诉我更好的方法,有一些代表可供抢夺!