cha1i Ответов: 1

Как привязать объекты в MVC?


Добрый день всем,

Мне было поручено изучить MVC с помощью онлайн-учебников и внедрить эти знания в новое веб-приложение. Так что я немного зеленый, когда дело доходит до MVC.

Одна проблема, которую я до сих пор не решил, заключается в том, как связывать объекты при использовании Entity Framework. Классы с базовыми типами данных извлекаются без проблем, но теперь я создал класс "Survey", который включает в себя свойство класса "Outcome". "Результат" - это справочная таблица, содержащая столбцы идентификаторов и описаний, которая успешно заполняется. В базе данных EF создал внешний ключ с именем "Outcome_ID". Но когда уровень доступа к данным(который наследует DbContext) компилирует DBSet (of Survey), поле результата остается нулевым, несмотря на то, что все они имеют действительные внешние ключи в базе данных.

Класса. :
Imports System.ComponentModel.DataAnnotations
Public Class Survey

    <Key>
    <Schema.DatabaseGenerated(Schema.DatabaseGeneratedOption.Identity)> Public Property ID As Integer
    Public Property Created As DateTime
    Public Property LastModified As DateTime
    Public Property Owner As String
    Public Property Outcome As Outcome
    Public Property SurveyCountry As Integer

End Class


Уровень Доступа К Данным:
Imports System.Data.Entity

Public Class DAL
    Inherits DbContext

    Public Property Users As DbSet(Of User)
    Public Property Surveys As DbSet(Of Survey)
    Public Property Outcomes As DbSet(Of Outcome)

    Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
        modelBuilder.Entity(Of User).ToTable("User")
        modelBuilder.Entity(Of Survey).ToTable("Survey")
        modelBuilder.Entity(Of Outcome).ToTable("Outcomes")
        MyBase.OnModelCreating(modelBuilder)
    End Sub
End Class


Функция класса репозитория (возвращает список опросов, каждый из которых имеет нулевой "результат"):
Public Function GetSurveyList() As List(Of Survey)
    If IsNothing(data) Then data = New DAL()
    Return data.Surveys.ToList()
End Function


Я убежден, что мне нужно добавить какую-то форму привязки к полю, или инициализацию, или что-то еще. Что я упускаю? Заранее спасибо за вашу помощь!

Что я уже пробовал:

Посмотрел это в интернете, но не смог найти решения.

Richard Deeming

Попробуйте включить свойство навигации:

Return data.Surveys.Include(Function (s) s.Outcome).ToList()

Entity Framework Загрузка Связанных Сущностей[^]

mgoad99

Мне неясно, есть ли у вас вопрос MVC или вопрос EF. В любом случае, я думаю, что ваш подход может быть ошибочным.

Я рекомендую серию учебных пособий по MVC от Microsoft. Для меня наличие примера-отличный способ понять, как заставить что-то работать.

Это ссылка на конкретный учебник, но на этом сайте есть еще много других.

https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/database-first-development/

Возможно, просмотр учебника поможет вам указать правильное направление.

1 Ответов

Рейтинг:
12

cha1i

Спасибо всем за ваши ответы! Мне удалось заставить его работать двумя разными способами:

Я попробовал решение Ричарда, но ничего не вышло. Но с небольшой поправкой это произошло:

Return data.Surveys.Include("Outcome").ToList()

Затем я прочитал эту статью: Ленивая, нетерпеливая и явная загрузка связанных данных и понял, что если я сделаю свойство "Переопределяемым", оно сработает. Это VB.NET с сайта на C#'ы 'виртуальный'. Это решение должно создать немного меньше накладных расходов на базу данных, чем первое решение, если я правильно понял.
Public Overridable Property Outcome As Outcome

Спасибо,

Чарльз.


Richard Deeming

Если сделать свойство переопределяемым, то получится ленивая загрузка. Это будет потенциально увеличение нагрузка на сервер.

Это известно как проблема "выбрать N+1", потому что вместо одного запроса для загрузки N записей и связанной сущности у вас есть один запрос для загрузки записей и еще N запросов для загрузки связанной сущности.

Если вы знаете, что вам всегда будет нужна связанная сущность, используя Include почти всегда будет давать лучшую производительность.

Производительность Entity Framework и что вы можете с этим поделать[^]