関連する行をデータベースに挿入できません。ASP.NET アプリケーションで新しいオブジェクトをデータベースに挿入すると、外部キー違反エラーが発生しますが、コンソール アプリケーションでは発生しません。
問題を再現する手順は次のとおりです。
新しいデータベースで次の T-SQL スクリプトを作成して実行します。
create table dbo.[Groups] ( GroupId int identity primary key, Name nvarchar(64) not null ) create table dbo.[Objects] ( ObjectId int identity primary key, GroupId int not null foreign key references [Groups] on delete cascade, Name nvarchar(64) not null )
「ConsoleProgram」という名前の C# コンソール アプリケーションをセットアップします。
- 「dsObjects」という名前の新しい DataSet をプロジェクトに追加します。
- テーブル "Groups" と "Objects" をサーバー エクスプローラーからデザイナーにドラッグします。
- 2 つのテーブル間のリレーションを編集し、リレーションを「リレーションと外部キー制約の両方」に設定し、ルールを「カスケード」に更新します。
次のコードを「メイン」に挿入します。
// (assuming appropriate using statement for dsObjectsTableAdapters) var ds = new dsObjects(); var mgr = new dsObjectsTableAdapters.TableAdapterManager { GroupsTableAdapter = new GroupsTableAdapter(), ObjectsTableAdapter = new ObjectsTableAdapter() }; mgr.GroupsTableAdapter.Fill( ds.Groups ); mgr.ObjectsTableAdapter.Fill( ds.Objects ); var row = ds.Groups.AddGroupsRow( "Fruits" ); ds.Objects.AddObjectsRow( row, "Apple" ); ds.Objects.AddObjectsRow( row, "Banana" ); ds.Objects.AddObjectsRow( row, "Orange" ); mgr.UpdateAll( ds );
プログラムを実行し、新しい行がそれぞれのテーブルに挿入されたことを確認します。
GroupId Name ----------- ------- 1 Fruits (1 row(s) affected) ObjectId GroupId Name ----------- ----------- ------- 1 1 Apple 2 1 Banana 3 1 Orange (3 row(s) affected)
新しく作成したデータを削除します。
- ソリューションを閉じます。
- 新しい ASP.NET Web アプリケーションを作成します。
- 手順 3 ~ 5 を繰り返します。
- 手順 6 のコードを Default.aspx の Page_Load 関数に挿入します。
- プログラムを実行します。
- 外部キー違反に関する例外に注意してください (存在する場合)。
- コンソール プログラムを再度実行し、データが正常に作成されたことを確認します。
- データベースを再作成し、ASP.NET アプリケーションを再度実行して、同じ例外に注意してください。
UpdateAll メソッドを使用してテーブルを順番に更新しようとしましたが、両方のプロジェクトで同じ結果になりました。
これが ConsoleApplication では機能するのに、ASP.NET アプリケーションでは機能しない理由について、私は完全に途方に暮れています。何か案は?