Как загрузить обе модели для получения одного выхода в MVC5 - PullRequest
2 голосов
/ 27 апреля 2019

У меня есть контроллер MVC с именем сотрудников, основанный на таблице сотрудников. В одном из полей сотрудника есть ссылка внешнего ключа на таблицу уровня доступа. Обе эти таблицы являются моделями в приложении MVC (доступ и сотрудник).

Когда я создаю представление для просмотра списка всех сотрудников, я получаю эту ошибку, и она указывает на нее, потому что она не может ссылаться на поле accessleveldescription в таблице доступа / модели.

Я получаю ошибку: Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения.

Что я хочу знать, так это как связать эти два, чтобы я мог показать информацию в виде?

Я понимаю, что AccessLevelDescription запрашивается при заполнении представления, к тому времени, когда DBContext закрылся, отсюда и ошибка, я просто не уверен, как ее исправить.

Прочитайте несколько статей, попытайтесь добавить ToList (но, вероятно, неправильно его настроили), я попытался создать переменные для хранения AccessLevelDescription, но все еще не могу связать их.

Контроллер:

// GET: Employee
        public ActionResult Index()
        {
            List<accesslevel> AccessList = new List<accesslevel>();
            List<userdetail> EmployeeList = new List<userdetail>();
            using (dbEntities dbModel = new dbEntities())
            {

                EmployeeList = dbModel.userdetails.ToList<userdetail>();
                AccessList = dbModel.accesslevels.ToList<accesslevel>();

            }
            return View(EmployeeList);
        }

Вид:

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.UserName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.UserEmail)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.UserPassword)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.UserCreateDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.UserLastLogin)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.accesslevel.AccessLevelDescription)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.companydetail.CompanyName)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.UserID }) |
            @Html.ActionLink("Details", "Details", new { id=item.UserID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.UserID })
        </td>

Ожидается, что результат заполнит информацию о сотруднике вместе с установленным уровнем доступа, назначенным для сотрудника.

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Вы должны использовать это:

EmployeeList = dbModel.userdetails.Include(x => x.accesslevels).ToList();

вместо:

EmployeeList = dbModel.userdetails.ToList<userdetail>();
0 голосов
/ 27 апреля 2019

В дополнение к ответу, если вы используете Ленивая загрузка , вам не нужно использовать include. Просто имейте свойство virtual Access в Employee:

public class Employee
{
    public Guid EmployeeId { get; set; }
    public string Name { get; set; }
    //This is the FK from Access entitie
    public int AccessId { get; set; }
    //This is the referente to use with the EF Lazy Loading
    public virtual Access Access { get; set; }
}

Подробнее о Ленивая загрузка.

Если вы не хотите использовать Lazy Загрузка ответа с использованием включенного в hassan.ef включения правильна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...