私は同じ問題を抱えていましたが、このリンクは、少なくとも私にとってはうまくいったものへの軌道に乗ってくれました。これが少なくとも誰かに役立つことを願っています! :)
- データベースを作成する
- aspnet テーブルを新しいデータベースに追加する
- 同じデータベースを指すように、web.config でデータベース接続を修正します。
- 「aspnet_」で始まるテーブルを除くすべてのテーブルを削除する SQL を記述します。
- 自分で書いたデータベース初期化子にSQLを追加します
- Global.asax.cs でデータベース初期化子への呼び出しを追加します。
1.データベースを作成する
通常、これは SQL Server Management Studio で行います。このコード例で使用したデータベースは SQL Server 2008R2 ですが、使用している SQL Server Express でも同じことを行いました。
2. aspnet テーブルを新しいデータベースに追加する
コマンドライン引数なしで使用すると、ウィザードのように機能する次のツールを使用します。%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regsql.exe
3. データベース接続を修正して、同じデータベースを指すようにします。
次の 2 行は、私が作成したテスト アプリケーションからのものです。2 番目の接続文字列 (MyHealthContext) の名前は、コードの最初のクラスに使用している DbContext の名前と同じであることに注意してください。
Dbコンテキスト:
public class MyHealthContext : DbContext
{
public DbSet<Person> People { get; set; }
public DbSet<PersonAttribute> PeopleAttributes { get; set; }
}
Web.config
<add name="ApplicationServices" connectionString="Server=localhost\mssql2008r2;Database=MyHealth;Integrated Security=True;" providerName="System.Data.SqlClient"/>
<add name="MyHealthContext" connectionString="Server=localhost\mssql2008r2;Database=MyHealth;Integrated Security=True;" providerName="System.Data.SqlClient"/>
4. aspnetdb-tables 以外をすべて削除する SQL
DECLARE @cmdDropConstraints VARCHAR(4000)
DECLARE @cmdDropTables VARCHAR(4000)
-- ======================================================================
-- DROP ALL THE FOREIGN KEY CONSTRAINTS FROM THE TABLES WE WANT TO DROP
-- ======================================================================
DECLARE cursorDropConstraints CURSOR FOR
SELECT
'ALTER TABLE ['+ s.name + '].[' + t.name + '] DROP CONSTRAINT [' + f.name +']'
FROM
sys.foreign_keys f
INNER JOIN sys.tables t ON f.parent_object_id=t.object_id
INNER JOIN sys.schemas s ON t.schema_id=s.schema_id
WHERE
t.is_ms_shipped=0
AND t.name NOT LIKE 'aspnet_%'
AND t.name <> 'sysdiagrams'
OPEN cursorDropConstraints
WHILE 1=1
BEGIN
FETCH cursorDropConstraints INTO @cmdDropConstraints
IF @@fetch_status != 0 BREAK
EXEC(@cmdDropConstraints)
END
CLOSE cursorDropConstraints
DEALLOCATE cursorDropConstraints;
-- ======================================================================
-- DROP ALL THE RELEVANT TABLES SO THAT THEY CAN BE RECREATED
-- ======================================================================
DECLARE cursorDropTables CURSOR FOR
SELECT
'DROP TABLE [' + Table_Name + ']'
FROM
INFORMATION_SCHEMA.TABLES
WHERE
Table_Name NOT LIKE 'aspnet_%'
AND TABLE_TYPE <> 'VIEW'
AND TABLE_NAME <> 'sysdiagrams'
OPEN cursorDropTables
WHILE 1=1
BEGIN
FETCH cursorDropTables INTO @cmdDropTables
IF @@fetch_status != 0 BREAK
EXEC(@cmdDropTables)
END
CLOSE cursorDropTables
DEALLOCATE cursorDropTables;
5. データベース初期化子のコード:
以下の「SQL CODE GOES HERE」を手順 4 の SQL に置き換えます。
public class MyHealthInitializerDropCreateTables : IDatabaseInitializer<MyHealthContext>
{
public void InitializeDatabase(MyHealthContext context)
{
bool dbExists;
using (new TransactionScope(TransactionScopeOption.Suppress))
{
dbExists = context.Database.Exists();
}
if (dbExists)
{
// Remove all tables which are specific to the MyHealthContext (not the aspnetdb tables)
context.Database.ExecuteSqlCommand(@"SQL CODE GOES HERE");
// Create all tables which are specific to the MyHealthContext (not the aspnetdb tables)
var dbCreationScript = ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript();
context.Database.ExecuteSqlCommand(dbCreationScript);
Seed(context);
context.SaveChanges();
}
else
{
throw new ApplicationException("No database instance");
}
}
protected virtual void Seed(MyHealthContext context)
{
//TODO: Add code for seeding your database with some initial data...
}
}
6. 新しいデータベース初期化子をフックするコード
カスタム データベース初期化子が実稼働環境で誤って実行されないようにするために、#if DEBUG ステートメントを追加しました。これは、公開する前に常にコードをリリース モードでコンパイルするためです。
protected void Application_Start()
{
//TODO: Comment out this database initializer(s) before going into production
#if DEBUG
Database.SetInitializer<MyHealthContext>(new MyHealthInitializerDropCreateTables()); // Create new tables in an existing database
#endif
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}