繁体   English   中英

EF5和简单成员资格的数据库初始化问题

[英]Database Initialisation issue with EF5 and Simple Membership

我的global.asax文件中有两个数据库初始化程序。

第一个应该使用相关表创建我的数据库,第二个应该初始化简单成员资格所需的所有表。

我遇到的问题是应该创建我的数据库的第一个初始化方法没有执行任何操作(至少看起来是这样)。 简单的成员资格初始化程序工作正常。

我要从上下文创建的表仅在存储库类中创建上下文的新实例时创建。 然后失败了,因为它试图创建一个已经存在的用户配置文件表,因为WebSecurity.InitialiseDatabaseConnection初始化程序已经创建了它?

为什么直到在存储库方法中创建上下文后才执行第一个数据库初始化程序?

该数据库是SQL Server LocalDB。

这是Global.asax.csApplication_Start方法:

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

这是Context类:

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初始化程序移动到我的Configuration类的Seed方法中,如下所示,尽管这解决了按正确顺序创建表的问题,但我仍然不明智地解释为什么数据库无法获取在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" });
    }

编辑2号:

为了使其正常工作,我使用了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();
        }

如果有人可以告诉我更好的方法,那就可以争取一些代表!

代替

    using (var db = new MyContext())
    {
        var results = db.MyEntity.FirstOrDefault();
    }

尝试

new MyContext().Database.Initialize(false)
if (!WebSecurity.Initialized)
    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM