1

global.asax 파일에 데이터베이스 초기화 프로그램이 두 개 있습니다.EF5 및 단순 멤버쉽으로 인한 데이터베이스 초기화 문제

하나는 관련 테이블로 데이터베이스를 만들어야하며 하나는 간단한 멤버십에 필요한 모든 테이블을 초기화합니다.

내가 가지고있는 문제는 내 DB를 만들어야하는 첫 번째 초기화 방법이 아무 것도하지 않는다는 것입니다 (적어도 그렇게 보입니다). 간단한 회원 초기화 프로그램이 정상적으로 작동합니다.

내 컨텍스트에서 작성하려는 테이블은 컨텍스트의 새 인스턴스가 내 리포지토리 클래스 내에 만들어 질 때만 만들어집니다. WebSecurity.InitialiseDatabaseConnection 이니셜 라이저가 이미 작성했기 때문에 이미 존재하는 사용자 프로필 테이블을 만들려고하기 때문에 실패합니다.

컨텍스트가 리포지토리 메서드에서 만들어 질 때까지 첫 번째 Database initialiser가 실행되지 않는 이유는 무엇입니까?

데이터베이스는 SQL Server LocalDB입니다. 컨텍스트 클래스 다음

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

것 :

여기 Global.asax.csApplication_Start 방법이다

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

편집 : 나는했습니다 SimpleMem을 옮겼다. 다음과 같이 시드 구성 메서드의 Beed 초기화 메서드를 사용하면 테이블의 문제를 해결할 수 있습니다. 그래도 초기화 프로그램이 호출 될 때 데이터베이스가 초기화되지 않는 이유에 대해 현명하지 않습니다. 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 방법에 새로운 컨텍스트를 생성하고 DB에서 결과를 검색. 그런 다음 적용 할 단계에서 마이그레이션을 적용합니다.

지저분하고 추한 상을받지는 못 하겠지만 헤이 작동하고 아무 동물도 해를 입지 않아서 진행됩니다.

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

누군가가 나에게 더 좋은 방법을 말해 줄 수있는 사람은 누구인가?

답변

0

대신

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