C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: EntityFrameworkでRemoveできない件


(過去ログ 120 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■70405 / inTopicNo.1)  EntityFrameworkでRemoveできない件
  
□投稿者/ なかしげ (1回)-(2014/03/20(Thu) 19:24:25)

分類:[データベース全般] 

お世話になります。
EntityFrameworkで質問させて下さい。

使用言語:C#

データベースの状態が以下の場合とします。

[テーブル名:Directory]

|ID|Name|ParentId|
ーーーーーーーーーーー
|AA|Root|NULL  |
|BB|Dir1|AA   |

※ID…主キー
 ParentId…外部キー(IDを参照している)

この時、下記のコードで例外が発生します。

using(var context = new DbContext)
{
 var entity = context.Directory.FirstOrDefault(q => q.ID == "AA");
 context.Directory.Remove(entity);
 context.SaveChanges(); ←ここで例外発生
}

例外内容は以下のとおりです。

「DELETE ステートメントは
 SAME TABLE REFERENCE 制約 "FK_dbo.Directory_dbo.Directory_ParentId" と競合しています。
 競合が発生したのは、データベース "TestDataBase"、
 テーブル \"dbo.Directory\", column 'ParentId' です。
 ステートメントは終了されました。」

おそらくは外部キーで参照されているエンティティのため、
Removeが失敗しているのだと思っています。

参照先をすべてRemoveしてから、目的のエンティティをRemoveすれば動作はしますが、
できれば参照先をまとめて、一括でRemoveしたいと思います。

何か方法があれば、ご教授ください。

不足している情報等ありましたら追記いたしますので、
よろしくお願いします。

以上

引用返信 編集キー/
■70418 / inTopicNo.2)  Re[1]: EntityFrameworkでRemoveできない件
□投稿者/ WebSurfer (201回)-(2014/03/21(Fri) 13:01:10)
No70405 (なかしげ さん) に返信
> お世話になります。
> おそらくは外部キーで参照されているエンティティのため、
> Removeが失敗しているのだと思っています。
>
> 参照先をすべてRemoveしてから、目的のエンティティをRemoveすれば動作はしますが、
> できれば参照先をまとめて、一括でRemoveしたいと思います。
>
> 何か方法があれば、ご教授ください。

どうしても Entity Framework ということであれば、以下のレスは回答にはならないかもしれませんが・・・

Visual Studio には、型指定された DataSet + TableAdapter をウィザードベースで自動生成する機能があります。さらに、Visual Studio 2008 以降では、階層更新を実現する TableAdapterManager クラスが追加で自動生成されるようになりました。

それらを利用してはいかがですか。以下のページに、FK 制約に従って階層更新を実現する Windows Forms アプリを作成するチュートリアルがあります。

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
http://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688


階層更新を実現するするための TableAdapterManager の説明は以下のページが参考になると思います。

TableAdapterManager の概要
http://msdn.microsoft.com/ja-jp/library/bb384426.aspx

TableAdapterManager
http://surferonwww.info/BlogEngine/post/2011/12/21/TableAdapterManager.aspx

引用返信 編集キー/
■70433 / inTopicNo.3)  Re[2]: EntityFrameworkでRemoveできない件
□投稿者/ なかしげ (3回)-(2014/03/24(Mon) 13:58:14)
No70418 (WebSurfer さん) に返信

回答ありがとうございます。
返信が遅くなり申し訳ありません。

> どうしても Entity Framework ということであれば
現在開発中のアプリケーションでEFを利用しているため、
EFでのRemove方法を教えていただければと思っております。

ただ、TableAdapterManagerについては勉強不足でしたので、
貼っていただいたリンクは参照させていただきます。
ありがとうございます。

補足情報としまして、
親子関係が別テーブルの場合は、親が削除(Remove)されると
子も自動的に削除されるようです。(下記参照)

[テーブル名:Directory]

|ID|Name|
ーーーーーー
|AA|Root|

[テーブル名:File]

|ID|Name|ParentId|
ーーーーーーーーーーー
|BB|File|AA   |

※ParentId…外部キー(DirectoryテーブルのIDを参照している)

この状態から、Directoryテーブルの AA をRemoveすると
自動的にFileテーブルの BB がRemoveされます。


同一テーブル内での親子関係ではやはり無理なのでしょうか。。

以上


引用返信 編集キー/
■70434 / inTopicNo.4)  Re[3]: EntityFrameworkでRemoveできない件
□投稿者/ WebSurfer (202回)-(2014/03/24(Mon) 17:18:09)
No70433 (なかしげ さん) に返信
> 同一テーブル内での親子関係ではやはり無理なのでしょうか。。

同一テーブルということに気がつきませんでした。

とすると、先に紹介した TableAdapterManager は使えないようです。

Entity Framework を利用して実現できるかは自分には分かりません。すみま
せんが、他の方の回答をお待ちください。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -