Проблема с использованием связанных объектов в & ldquo; database-first & rdquo;

Простое решение:

1) Откройте URL-адрес проекта: https://github.com/someuser/project-name 2) вверху, кроме проекта имя, нажмите EDIT

0
задан Brian Tompsett - 汤莱恩 7 March 2019 в 20:15
поделиться

1 ответ

Вероятно, это связано с круговыми ссылками между вашим Argomenti * & amp; Модератор / Площадь. Область удерживает коллекцию обратно в Argomenti *, поэтому, когда MVC начинает сериализовать корневую сущность (Argomenti), она попадает в Area, затем перебирает в этой области коллекцию Argomenti * и затем цикл продолжается. Он выручает и не пытается сериализовать циклические зависимости.

Как правило, лучшее, что нужно сделать с EF и представлениями, это , а не пытаться отправить объекты в представление. Вместо этого создайте модель представления POCO (обычный старый объект C #) для отправки в представление. Эта модель представления содержит только поля, необходимые для представления, и ваш запрос EF использует .Select() для заполнения этой модели представления. Это позволяет избежать всей проблемы циклических ссылок и исключает необходимость преднамеренной активной загрузки (.Include()) или риска производительности из-за отложенной загрузки.

Например: если мне нужен список Argumenti, и я хочу отобразить каждую область и модератора как часть этого:

[Serializable]
public class ArgumentiViewModel
{
    public string NomeArgomento { get; set; }
    public bool? Archiviato { get; set; }
    public int? NumeroRigaPerArea { get; set; }
    public string TestoPerArgomento { get; set; }
    public string NomeArea { get; set; } // From Area
    public string NomeCognome { get; set; } // From Moderator
}

Затем, когда я хочу вернуть это в представление: [119 ]

var argomentiViewModels = db.ArgomentiPerArea
    .Select(x => new ArgomentiViewModel
    {
        NomeArgomento = x.NomeArgomento,
        Archiviato - x.Archiviato,
        NumeroRigaPerArea = x.NumeroRigaPerArea,
        TestoPerArgomento = x.TestoPerArgomento,
        NomeArea = x.Area.NomeArea, // From Area
        NomeCognome = x.Moderatori.NomeCognome // From Moderator
    }).ToList();

string msg = "m";
return View(argomentiViewModels);

Я суммировал пару веских причин, почему код не должен возвращать сущности в представление здесь .

0
ответ дан Steve Py 7 March 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: