4

インターネットを徹底的に検索しましたが、問題に対する明確な答えが見つかりませんでした。aspnet.db データベースを取得しました。しかし、このデータベースに独自のテーブルとデータを追加したいと考えています。接続文字列で接続しようとすると:

<add name ="ToernooiCompanionDBContext" connectionString ="Data Source= .\SQLEXPRESS; Integrated Security = SSPI; Trusted_Connection=True; Initial Catalog= aspnetdb"  providerName ="System.Data.SqlClient"/>

C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA に新しいデータベース (aspnetdb.mdf) が作成されます。

データベース (codefirst によって自動的に生成される) を APP_DATA フォルダー内の既存のデータベースとマージする必要があります。私は何を間違っていますか?

AttachDbFilename=|DataDirectory|aspnetdb.mdf接続文字列にとを追加するUser Instance=trueか、machine.config で定義されている接続文字列を使用しようとしましLocalSqlServerたが、いずれの場合も既存のデータベースが上書きされます。削除するInitial Catalog=aspnetdbと、最初のカタログが必要であるというエラーが表示されます。

4

2 に答える 2

4

私は同じ問題を抱えていましたが、このリンクは、少なくとも私にとってはうまくいったものへの軌道に乗ってくれました。これが少なくとも誰かに役立つことを願っています! :)

  1. データベースを作成する
  2. aspnet テーブルを新しいデータベースに追加する
  3. 同じデータベースを指すように、web.config でデータベース接続を修正します。
  4. 「aspnet_」で始まるテーブルを除くすべてのテーブルを削除する SQL を記述します。
  5. 自分で書いたデータベース初期化子にSQLを追加します
  6. 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);
    }
于 2012-06-30T19:07:07.213 に答える
0
  1. 新しいデータベースとしてアタッチして、SQLサーバーでASPNetDB dbを開きます
  2. ASPNetDB からテーブル/ストアド プロシージャの作成スクリプトを作成し、独自のデータベースで実行して、データベースにテーブルを作成します。
  3. アプリケーションの web.config を開き、アプリケーションを独自のデータベースにアタッチします。接続文字列の名前をコピーします
  4. メンバーシップ エリアに移動し、接続文字列名をコピーした名前に置き換えます
  5. 上記のステップもエリアで行います
于 2012-05-17T10:06:15.433 に答える