MSSQL バックエンドで c# データセットを使用しています。自分自身を参照するテーブルがあります。親行を追加してからそれに子を追加すると、間に更新を呼び出さずに制約例外が発生します。エンティティが追加されたのと同じ順序で挿入が実行されていないためだと思います。これを回避する方法はありますか?ユーザーがアイテムを追加し、最後にデータベースにコミットできるようにしたい (ユーザーがすべて正しいことを確認したとき)。
これが私のテーブル定義とサンプルアプリケーションです:
CREATE TABLE [dbo].[AssetServiceItems] (
[ServiceItemID] [int] IDENTITY(1, 1) NOT NULL,
[Description] [nvarchar](50) NOT NULL,
[Parent] [int] NULL,
CONSTRAINT [PK_AssetServiceItems] PRIMARY KEY CLUSTERED ([ServiceItemID] ASC) WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[AssetServiceItems]
WITH CHECK ADD CONSTRAINT [AssetServiceItems_parent] FOREIGN KEY ([Parent]) REFERENCES [dbo].[AssetServiceItems]([ServiceItemID])
ALTER TABLE [dbo].[AssetServiceItems] CHECK CONSTRAINT [AssetServiceItems_parent]
そしてプログラム...
public static void Main(string[] args)
{
RelTestTableAdapters.AssetServiceItemsTableAdapter adapter = new RelTestTableAdapters.AssetServiceItemsTableAdapter();
RelTest dataSet = new RelTest();
var parent = dataSet.AssetServiceItems.NewAssetServiceItemsRow();
parent.Description = "Parent";
dataSet.AssetServiceItems.AddAssetServiceItemsRow(parent);
var child = dataSet.AssetServiceItems.NewAssetServiceItemsRow();
child.Description = "child";
child.SetParentRow(parent);
dataSet.AssetServiceItems.AddAssetServiceItemsRow(child);
adapter.Update(dataSet);
Console.ReadKey(true);
}
INSERT ステートメントは、FOREIGN KEY SAME TABLE 制約 "AssetServiceItems_parent" と競合しました。データベース「RelTest」、テーブル「dbo.AssetServiceItems」、列「ServiceItemID」で競合が発生しました。