Entity Framework 4.1 を使用して MVC3 Web アプリを作成しています。問題は、循環参照があり、例外が発生することです。間違っている理由を理解したので、多対多の関係から ON DELETE/UPDATE CASCADE を削除したいと思います。問題は、それを行う方法がわからないことです...それが私の問題の説明です。ここに私のモデルがあります:
質問 ->-。
| | | |
| | | |
/|\ |
フィールド | フィールド
| | | |
| | | |
/|\ |
答え-----'
すべての質問には複数のフィールドがあり、すべてのフィールドには複数の回答があります。質問または回答を削除するときに、対応する回答を削除したいと考えています。ここで追加の作業を行う必要はないと思います。ただし、各回答には複数の依存する質問を含めることができます (すべての質問は多くの回答に依存できます)。この関係は、たとえば、他の質問への回答が YES の場合にのみ質問を表示するために使用されます... 回答を削除する場合、それに依存するすべての質問を削除するのではなく、依存関係のみを削除します。
私のモデル Question オブジェクトには次のものがあります。
' VB
Public Overridable Property AnswerDependencies As List(Of QuestionAnswer)
// C#
public virtual List < QuestionAnswer > AnswerDependencies { get; set; }
および QuestionAnswer オブジェクトには次のものがあります。
' VB
Public Overridable Property DependentQuestions As List(Of Question)
// C#
public virtual List < Question > DependentQuestions { get; set; }
次のプロパティを持つ DataContext クラスの OnModelCreating イベントで予想される動作を定義する方法:
Public Property Questions As DbSet(Of Question)
Public Property QuestionFields As DbSet(Of QuestionField)
Public Property QuestionAnswers As DbSet(Of QuestionAnswer)
編集
問題の解決策を見つけました!次のような QuestionAnswerDependency オブジェクトを手動で作成しました。
Public Class QuestionAnswerDependency
Inherits ModelBase
Public Property QuestionId As Integer?
Public Overridable Property Question As Question
Public Property AnswerId As Integer
Public Overridable Property Answer As QuestionAnswer
Sub New(ByRef q As Question, ByRef a As QuestionAnswer)
Me.New()
Me.Question = q
Me.Answer = a
End Sub
Sub New()
End Sub
End Class
QuestionId プロパティを null 可能にしました。これにより、CASCADE ON DELETE が発生せず、循環参照が解決されます。Question および QuestionAnswer オブジェクトには、 QuestionAnswerDependency オブジェクトのリストがあります。
Public Overridable Property QuestionAnswerDependencies As List(Of QuestionAnswerDependency)
EFは私が望むことを自動的に行うことはできないと思いますが、「中間オブジェクト」を作成せずにそれを達成する方法についてアイデアがあれば教えてください。