Как создать отношение «многие ко многим» без CASCADE в Entity Framework 4.1? - PullRequest
1 голос
/ 11 октября 2011

Я делаю веб-приложение MVC3, используя Entity Framework 4.1. Проблема в том, что у меня есть циклическая ссылка, и я получаю исключение. Я понимаю, почему это неправильно, поэтому я хотел бы удалить ON DELETE / UPDATE CASCADE из моих отношений «многие ко многим». Проблема в том, что я не знаю, как это сделать ... Это было бы для описания моей проблемы. Вот моя модель:

Вопросы -> -.
| |
| |
/ | \ |
Поля |
| |
| |
/ | \ |
Ответы ----- '

Каждый вопрос имеет несколько полей, а каждое поле имеет несколько ответов Когда я удаляю вопрос или ответ, я хочу удалить соответствующие ответы. Я думаю, что никакой дополнительной работы здесь не нужно делать. Однако у каждого ответа может быть несколько зависимых вопросов (каждый вопрос может зависеть от многих ответов). Это отношение используется для отображения вопроса, только если ответ на какой-либо другой вопрос был ДА, например ... Теперь, если я удалю ответ, я не хочу удалять все вопросы, которые зависят от него, а только удалить зависимость.

В моей модели объект Вопрос имеет:

' 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; }  

Как определить ожидаемое поведение в событии OnModelCreating в моем классе DataContext, который имеет следующие свойства:

Public Property Questions As DbSet(Of Question)  
Public Property QuestionFields As DbSet(Of QuestionField)  
Public Property QuestionAnswers As DbSet(Of QuestionAnswer)  

EDIT

Я нашел решение своей проблемы! Я вручную создал объект 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 обнуляемым, что приводит к отсутствию CASCADE ON DELETE и разрешает циклическую ссылку. Теперь у объектов Question и QuestionAnswer есть список объектов QuestionAnswerDependency:

Public Overridable Property QuestionAnswerDependencies As List(Of QuestionAnswerDependency)

Я думаю, что EF не может автоматически делать то, что я хочу, но дайте мне знать, если у вас есть идея, как этого достичь, не создавая промежуточный объект.

1 Ответ

1 голос
/ 11 октября 2011
...