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.cs
내 Application_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();
}
누군가가 나에게 더 좋은 방법을 말해 줄 수있는 사람은 누구인가?