0

コードファーストで定義された次のテーブルがあります。

public class Action 
{
    public int ActionId { get; set; }

    public int? EmailMessageId { get; set; }
    public virtual EmailMessage EmailMessage { get; set; }
}

public class EmailMessage
{
    public int EmailMessageId { get; set; }

    public string Content { get;set;
}

アクションが対応する EmailMessage で作成されている場合、アクションを削除しても EmailMessage のエントリは削除されません。EF は 1 対多の関係でのみカスケード削除を作成するようです。この場合、関係は 0 または 1 の関係であり、デフォルトではカスケード削除が設定されていません。

次に、流暢な構成を追加しました。

modelBuilder
  .Entity<Action>()
  .HasOptional(x =>x.EmailMessage)
  .WithMany()
  .HasForeignKey(x=>x.EmailMessageId)
  .WillCascadeOnDelete(true);

Management Studioでスキーマを表示すると、CASCADE DELETEが正しく設定されているようです。しかし、アクションから行をデータベースから手動で削除すると、EmailMessage の行が残ります。

ここで私は正確に何を間違っていますか?構成で「WithOptionalDependent()」を使用すると、どこかに到達する可能性があると思いました。しかし、スキーマを見ると、テーブルに既に EmailMessageId があるのに、「EmailMessage_EmailMessageId」が導入されていましたか?

ここで何が悪いのか誰にもアドバイスできますか?

4

2 に答える 2

0

カスケード削除は、が削除されたときにを削除するように設計されており、その逆ではありません。この場合、Action は EmailMessage 親の外部キーに関連付けられた子です。そのため、アクションを削除しても EmailMessage には影響しませんが、EmailMessage を削除すると削除がアクションにカスケードされます。

于 2012-07-09T14:25:20.660 に答える
0

「contextName.Entry(parentStudySession).State = System.Data.Entity.EntityState.Deleted;」を使用するときに気付きました。いくつかの子を持つ親を削除するには..私はEF 6.3について話します.EFは私たちのために子を削除しません.親自体を削除しませんでしたが、削除制約でカスケードしています. 代わりに、「操作に失敗しました: 1 つ以上の外部キー プロパティが null 値を許容しないため、関係を変更できませんでした。関係に変更が加えられると、関連する外部キー プロパティが次のように設定されます。 null 値です。外部キーがそうでない場合は ... "

代わりに、「contextName.StudySession.Remove(parentStudySession);」を使用すると 、EF 6.3はPARENTとCHILDRENを正常に削除します...削除制約でカスケードしています。 T.アダコル

于 2015-12-10T22:40:31.503 に答える